क्षण.js - UTC गलत दिनांक देता है


93

क्षण क्यों आता है। UTC हमेशा गलत दिनांक दिखाता है। क्रोम के डेवलपर कंसोल से उदाहरण के लिए:

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

वे दोनों "2013-07-17" वापस आएंगे , यह 18 वीं के बजाय 17 वीं क्यों लौट रहा है , जो इसमें पारित किया गया था।

लेकिन अगर मैं utc के बिना क्षणिका का उपयोग करता हूं:

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

मुझे वापस "2013-07-18" मिलता है, जो कि मैं भी उम्मीद करता हूं जब मैं क्षण का उपयोग करता हूं।

क्या इसका अर्थ है कि हम क्षण का उपयोग करते समय सही तिथि प्राप्त नहीं कर सकते हैं।


4
मुझे तुम्हारी जरूरत है नहीं लगता है toString()के बाद format()(यह पहले से ही एक स्ट्रिंग रिटर्न)।
एलेक्स

जवाबों:


158

डिफ़ॉल्ट रूप से, मोमेंटजेएस स्थानीय समय में पार्स करता है। यदि केवल एक तारीख स्ट्रिंग (बिना समय के) प्रदान की जाती है, तो समय आधी रात को चूक जाता है।

अपने कोड में, आप एक स्थानीय तारीख बनाते हैं और फिर इसे यूटीसी टाइमज़ोन में परिवर्तित करते हैं (वास्तव में, यह पल उदाहरण को यूटीसी मोड में बदल देता है ), इसलिए जब इसे प्रारूपित किया जाता है, तो इसे स्थानांतरित कर दिया जाता है (आपके स्थानीय समय के आधार पर) आगे या पीछे की ओर।

यदि स्थानीय समय क्षेत्र UTC + N (N एक धनात्मक संख्या है) है, और आप केवल दिनांक स्ट्रिंग करते हैं, तो आपको पिछली तारीख मिल जाएगी।

इसे उदाहरण देने के लिए कुछ उदाहरण हैं (DST के दौरान मेरा स्थानीय समय ऑफसेट UTC + 3 है):

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

यदि आप UTC के रूप में दिनांकित समय स्ट्रिंग की व्याख्या करना चाहते हैं, तो आपको इसके बारे में स्पष्ट होना चाहिए:

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

या, जैसा कि मैट जॉनसन ने अपने उत्तर में उल्लेख किया है, आप ( और शायद चाहिए ) इसे यूटीसी की तारीख के रूप में उपयोग करके पहले स्थान पर पार्स कर सकते हैं औरmoment.utc() अस्पष्टता को रोकने के लिए दूसरे तर्क के रूप में प्रारूप स्ट्रिंग शामिल करें।

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

किसी अन्य तरीके से यूटीसी तिथि को स्थानीय तारीख में बदलने के लिए, आप इस local()विधि का उपयोग कर सकते हैं :

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"

बहुत धन्यवाद। इसलिए मूल रूप से, मुझे यूटीसी का उपयोग करते समय हमेशा पास करना चाहिए या यूटीसी में पास होना चाहिए जैसा कि आपके दूसरे दृष्टिकोण में है।
Brg

या तो वह या स्थानीय समय क्षेत्र से चिपके रहते हैं। यदि आप सर्वर से समय भेजते हैं, तो आप उन्हें यूनिक्स टाइमस्टैम्प (एक्स) के रूप में या विशिष्ट टाइमज़ोन पर तार के रूप में व्यक्त कर सकते हैं। उपयोगकर्ता के स्थानीय समयक्षेत्र के बजाय UTC का उपयोग क्यों करें, वैसे भी (सर्वर को सामान्यीकृत डेटा भेजने के उद्देश्य को छोड़कर)?
मास्टर

1
ध्यान रखें कि new Date('07-18-2013 UTC')IE8 में काम नहीं करेगा, अगर आप ध्यान रखें।
Dzmitry Lazerka

2
मैं इतने लंबे समय से इससे जूझ रहा हूं। उन्हें वास्तव में अपनी साइट पर यह अच्छी तरह से समझाया जाना चाहिए था, क्योंकि मुझे लगता है कि यह क्षण का सबसे सामान्य उपयोग मामला है। जेएस। आपको बहुत - बहुत धन्यवाद! तुमने सचमुच मेरी त्वचा बचा ली!
वेबवंडर

यह कोड मेरे लिए काम करता है: [कोड] पल (strDate, 'DD / MM / YYYY h: mm A')। utc (strDate) .format ("YYYY-MM-DD HH: mm" [/ code]
उमर ईद

36

दोनों Dateऔर momentडिफ़ॉल्ट रूप से ब्राउज़र का स्थानीय समय क्षेत्र में इनपुट स्ट्रिंग पार्स होगा। हालाँकि Dateकभी-कभी इस संबंध में असंगत है। यदि स्ट्रिंग विशेष रूप से YYYY-MM-DD, हाइफ़न का उपयोग कर रहा है , या यदि यह है YYYY-MM-DD HH:mm:ss, तो इसे स्थानीय समय के रूप में व्याख्या करेगा । इसके विपरीत Date, momentहमेशा इस बारे में संगत होगा कि यह कैसे पार्स करता है।

आपके द्वारा प्रदान किए गए प्रारूप में UTC के रूप में इनपुट क्षण को पार्स करने का सही तरीका इस प्रकार होगा:

moment.utc('07-18-2013', 'MM-DD-YYYY')

इस प्रलेखन का संदर्भ लें ।

यदि आप इसे आउटपुट के लिए अलग-अलग प्रारूपित करना चाहते हैं, तो आप ऐसा करेंगे:

moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')

आपको toStringस्पष्ट रूप से कॉल करने की आवश्यकता नहीं है ।

ध्यान दें कि इनपुट प्रारूप प्रदान करना बहुत महत्वपूर्ण है। इसके बिना, 01-04-2013ब्राउज़र की संस्कृति सेटिंग के आधार पर, दिनांक 4 जनवरी या 1 अप्रैल को संसाधित हो सकती है।


केवल सीखने के लिए, सांत्वना में: moment.utc ('2013-07-18 0:00 +0100', 'YYYY-MM-DD HH: mm') मुझे देता है "2013-07-18 0:00 +0100 " लेकिन जब भागा पर jsfiddle पर क्या नापसंद है वह अलग है: थू जुल 25 2013 01:00:00 GMT + 0100 01:00:00 ध्यान दें । धन्यवाद।
Brg

momentकंसोल पर एक कच्चा आउटपुट करना बहुत उपयोगी नहीं है। आप शायद इसके आंतरिक गुणों में से एक को देख रहे हैं। परिणामों की जांच करने से पहले आपको इसे प्रारूपित करना चाहिए। उदाहरण के लिए moment.utc().format()या moment().format()
मैट जॉनसन-पिंट

दिनांक और क्षण दोनों डिफ़ॉल्ट रूप से ब्राउज़र के स्थानीय समय क्षेत्र में इनपुट स्ट्रिंग को पार्स करेंगे। मैं अभी ईडीटी पर हूं। new Date('2010-12-12')मुझे Date {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}FF 38.0.5 में देता है । बस "स्थानीय समय में" का अर्थ क्या है, इसे ठीक करने के लिए - इस मामले में, इसका मतलब प्रतीत होता है, " Dateयह मान लेगा कि ज़ोनलेस स्ट्रिंग UTC में है और स्थानीय समय को पार्स करेगा।" d.getUTCDate()= 12और d.getDate()=11
Ruffin

1
हां, कुछ अपवाद हैं। ES5 (अधिकांश वर्तमान ब्राउज़र) UTC के रूप में हाइफ़न के साथ तिथियों की व्याख्या करेगा, लेकिन स्थानीय समय के रूप में बाकी सब के बारे में व्याख्या की गई है। ES6 स्थानीय समय के समान स्ट्रिंग की व्याख्या करने के लिए इस व्यवहार को बदल रहा है। मैंने जवाब अपडेट किया।
मैट जॉनसन-पिंट

हा, हाँ, बस एमडीएन में यह कहते हुए भाग गया कि क्या '2012-12-12'यह यूटीसी बी / सी है यह एक आईएसओ प्रारूप में है, लेकिन 'December 12, 2012'यहां तक ​​कि '2012/12/12'ईएस 5 में स्थानीय समय क्षेत्र के साथ पार्स किया गया है), लेकिन आपने मुझे इसे हरा दिया है। इतना बढ़िया कि ES6 उन सभी को स्थानीय बनाता है [उन्होंने व्यंग्यात्मक रूप से कहा]। तिथियाँ एक दर्द हैं, (c) तिथियों का आगमन
रफ़िन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.