2016-03-22 9 views
5

हम अपने आवेदन में एक बग को ट्रैक कर रहे हैं जो प्रतीत होता है क्षण.जेएस स्वरूपण से संबंधित है।अजीब व्यवहार स्वरूपण moment.js दिनांक

यहाँ (संदर्भ के लिए, क्रोम, एफएफ, और एज में reproduced) समस्याग्रस्त कॉल है:

moment('2016-03-13T23:59:59.999-06:00').format('YYYY-MM-DD') 

हम क्या उम्मीद:

2016-03-13

हमें क्या मिलता है:

2 के रूप में यह केवल तारीख (अभी तक) है कि हम पर यह गलत व्यवहार को पुनः कर लिया है और डीएसटी उस दिन फ़्लिप है 016-03-14

यह प्रतीत होता है डेलाइट सेविंग टाइम के साथ कुछ है।

यदि हम यूटीसी ऑफसेट को -05:00 पर स्विच करते हैं तो यह ठीक से काम करता है।

यहाँ demonstrate

के लिए एक सरल JSBIN यहाँ क्या हो रहा है क्या है? हम इसे कैसे संबोधित कर सकते हैं?

+0

मेरा मानना ​​है कि इस http://stackoverflow.com/questions/7629286/annoying-javascript-timezone-adjustment-issue – Dazak

उत्तर

4

यदि आप डिफ़ॉल्ट पल कन्स्ट्रक्टर फ़ंक्शन का उपयोग करते हैं, तो आप उस कंप्यूटर के स्थानीय समय क्षेत्र में ऑफ़सेट के साथ एक तिथि को बदल देंगे।

इसी कारण से, आपका कोड अपेक्षित के रूप में काम कर रहा है। तिथि -6 से ली गई है और आपके स्थानीय ऑफसेट में परिवर्तित हो गई है।

यदि आप निर्दिष्ट समय क्षेत्र ऑफसेट में दिनांक का उपयोग करना चाहते हैं, तो पल का उपयोग करें।parseZone:

moment.parseZone('2016-03-13T23:59:59.999-06:00').format() 
"2016-03-13T23:59:59-06:00" 

आप समय क्षेत्र ऑफसेट उपेक्षा, और स्थानीय समय में काम करते हैं, एक प्रारूप शामिल नहीं है कि ऑफसेट निर्दिष्ट करने के लिए चाहते हैं। ऐसा करके, आप ऑफ़सेट को अनदेखा कर सकते हैं।

moment('2016-03-13T23:59:59.999-06:00', 'YYYY-MM-DDTHH:mm:ss.SSS').format() 
"2016-03-13T23:59:59-05:00" 

ध्यान दें कि मैं UTC-5 में हूँ और ऑफसेट के रूप में प्रदर्शित किया जाता है -5 क्योंकि मैं तारीख में ऑफसेट नजरअंदाज कर दिया।

पार्स गाइड कुछ मदद की हो सकती है: http://momentjs.com/guides/#/parsing/

+0

महान जवाब में मदद मिलेगी। 'पार्सज़ोन' कुंजी है। –

2

आप निर्दिष्ट करते हैं जो एन्कोडिंग (-6) पर एक समय क्षेत्र स्वरूपण के लिए क्लाइंट टाइम ज़ोन पर निर्भर हैं। अंतर अपराधी है।

0

असल में पल के प्रारूप समारोह में कुछ भी गलत नहीं है। console.log(moment.utc('2016-03-13T23:59:59.999-06:00').toString()); console.log(moment('2016-03-13T23:59:59.999-06:00').toString());

आप ऊपर लाइनों के दोनों पर अमल करने की कोशिश करते हैं, तो आप देखेंगे कि moment.utc() मूल रूप से भरपाई बंद लेता है और UTC समय टिप्पणी समय ही नहीं, तारीख और moment() तब्दील में बदल देता है -06 : 00 आपके स्थानीय टाइमज़ोन से ऑफ़सेट हो गया है और यदि आपके पास छोटे ऑफसेट हैं, तो आपको समय के कारण मूल रूप से गलत तिथि मिलती है।

आशा है कि मैंने मदद की।

3

momentjs documentation regarding parsing with time zones में, वे दिखाते हैं कि इनपुट स्ट्रिंग में निर्दिष्ट समय क्षेत्र को ध्यान में रखते हुए आपको moment.parseZone() का उपयोग करना चाहिए।

console.log(moment.parseZone('2016-03-13T23:59:59.999-06:00').format('YYYY-MM-DD'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js"></script>

ऊपर उत्पादन "2016/03/13" मेरे लिए कंसोल पर।

संबंधित मुद्दे