2012-04-22 17 views
18

सबसे पहले, मुझे लगता है कि टाइमज़ोन के पास शायद इसके साथ कुछ करना है। मैं ईएसटी/ईडीटी में हूं। इसके अलावा, मैं क्रोमियम 17/लिनक्स पर इसका परीक्षण कर रहा हूं।दिनांक निर्माता: संख्यात्मक तर्क बनाम स्ट्रिंग तर्क कुछ मामलों में अलग-अलग तिथियां दे रहा है

अब मान लें कि मैं दो तिथियों के इस तरह बना सकते हैं:

// December 5 

dateFromNumbers = new Date(2020, 11, 5); 
dateFromString = new Date("2020-12-5"); 

यह इन तिथियों लगता समान टाइम स्टांप होना चाहिए, और वे कार्य करें:

+dateFromNumbers == +dateFromString; // true 

... कम से कम इस मामले में । लेकिन कुछ मामलों में, वे नहीं करते:

// December 15 

dateFromNumbers = new Date(2020, 11, 15); 
dateFromString = new Date("2020-12-15"); 

+dateFromNumbers == +dateFromString; // false 

यहां क्या हो रहा है?

dateFromNumbers; // Tue Dec 15 2020 00:00:00 GMT-0500 (EST) 
dateFromString; // Mon Dec 14 2020 19:00:00 GMT-0500 (EST) 

लगता dateFromString की तरह 5 घंटे पहले इस मामले में dateFromNumbers से (ईएसटी जीएमटी है - 5, मुझे यकीन है कि यह किसी भी तरह से संबंधित है हूँ)।

ऐसा लगता है कि अक्टूबर से दिसंबर के अंत में यह प्रभावित होता है। यहां एक पहेली है जो देखना आसान बनाता है कि कौन से दिन अलग-अलग होते हैं (जब तक कि आप लाल-हरे रंग की रंगीन न हों, उस स्थिति में, मेरी माफी माँगना मुश्किल हो सकता है)।

http://jsfiddle.net/9gBfX/

क्या देता है?


नोट्स:

  • आप jsfiddle उदाहरण देखने के लिए के रूप में मैं यह दिखाई दे रही है EST/EDT के लिए अपने सिस्टम समय क्षेत्र सेट कर सकते हैं।
  • दिनांक का महीना संख्या शून्य-आधारित है; 11 एक टाइपो नहीं है।
  • यह समस्या हर साल दिखाई देती है जिसे मैंने चेक किया था।
+1

आपकी दूसरी मामला दिनांक 15 नवंबर, 2020 और 15 दिसंबर, 2020 है। क्या यह एक टाइपो है? – Habib

+0

क्रोम चल रहा है 18.0.1025.162 मीटर, विंडोज़, जीएमटी +2: परिणाम पुन: उत्पन्न होते हैं। लेकिन स्पष्ट रूप से स्ट्रिंग प्रस्तुति में समय निर्दिष्ट करने से समस्या हल हो जाती है। मैं आम तौर पर तारों से तिथियों से बचता हूं क्योंकि ब्राउज़र में प्रारूप समर्थन भिन्न और खराब दस्तावेज है, मिलीसेकंड बहुत अधिक विश्वसनीय हैं। – DCoder

उत्तर

6

V8's source code में देखने के बाद:

// Specification: 
// Accept ES5 ISO 8601 date-time-strings or legacy dates compatible 
// with Safari. 
<...> 
// A string that matches both formats (e.g. 1970-01-01) will be 
// parsed as an ES5 date-time string - which means it will default 
// to UTC time-zone. That's unavoidable if following the ES5 
// specification. 

आसपास के कोड पढ़ना, यह है कि दोनों माह और दिन 2 प्रतीकों लंबे साथ डेट समय स्ट्रिंग मान्य ES5 तिथि-समय स्ट्रिंग माना जाता है लगता है।

// Successfully parsed ES5 Date Time String. Default to UTC if no TZ given. 

"YYYY-MM-DD" के मामले में, एक बार कोड हो जाता है कि अब तक, ES5 पार्सर सफलतापूर्वक पार्स किया है: इसके अलावा ES5 पार्सर में नीचे, यह दिनांक और समय को पार्स करता है के बाद, वहाँ एक टिप्पणी है पूरी स्ट्रिंग, इसलिए यह लीगेसी पार्सर को टाइमज़ोन को स्थानांतरित करने का मौका मिलने से पहले लौटाता है। अन्यथा (महीना/दिन एक प्रतीक लंबा होता है) इसे "विरासत" डेटाटाइम के रूप में माना जाता है और विरासत पार्सर को इससे निपटने और इसे स्थानीयकृत करने के लिए मिलता है।

2

संयुक्त राज्य अमेरिका के लिए दिनांक विभाजक के रूप में "-" का उपयोग करने से कुछ ब्राउज़रों को भ्रमित कर दिया जाता है, कुछ लोग अंकगणित करेंगे, अन्य लोग NaN वापस कर देंगे, इसलिए "/" दिनांक विभाजक का उपयोग करें। एक संस्कृति जागरूक समाधान date.js का उपयोग करना है, जो एक उत्कृष्ट जावास्क्रिप्ट दिनांक हैंडलर है जो आपके द्वारा इंगित किए गए मुद्दों को हल करता है (http://www.datejs.com/)। पार्स पद्धति का उपयोग करना सभी भ्रम निकालता है:

Date.parse("2020-12-15").toString() // yields the correct date ("Tue Dec 15 00:00:00 PST 2020"). 
+2

"-" के बजाय "/" का प्रयोग करने का प्रयास करें। –

+0

जीजीजी मेरे जवाब को वोट देने में सही था। मुझे विस्तार करना चाहिए था और अब ऐसा किया है। –

+0

मैंने हालांकि इसे कम नहीं किया था। –

2

this post पर पहुंचाता है, ऐसा लगता है कि Date की स्ट्रिंग तर्क निर्माता ब्राउज़र द्वारा विभिन्न Date.parse() कार्यान्वयन की वजह से, कार्यान्वयन प्रति संवेदनशील है।

आपके माप सही हैं, और यदि आप अपने ब्राउज़र को ईएसटी को सही तरीके से पार्स करना चाहते हैं तो आपको शायद इस कन्स्ट्रक्टर का उपयोग करने से बचना चाहिए।

2

ऐसा लगता है कि दिनांक निर्माता को '-' के बजाय रिक्त स्थान की आवश्यकता है। इसकी अनुशंसित तरीका है। इस लिंक की जाँच करें:
3.3. Date and Time Specification

हालांकि foldingwhite अंतरिक्ष तिथि-समय विनिर्देश भर की अनुमति दी है, यह अनुशंसित है कि एक भी अंतरिक्ष में प्रत्येक जगह है कि FWS प्रतीत होता है (यह आवश्यक या वैकल्पिक रहा है या नहीं इस्तेमाल किया जा)

इसके अलावा इस लिंक की जाँच:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

डेटस्ट्रिंग: एक तारीख का प्रतिनिधित्व करने वाला स्ट्रिंग मान। स्ट्रिंग को पार्स विधि (आईईटीएफ-अनुरूप आरएफसी 2822 टाइमस्टैम्प) द्वारा मान्यता प्राप्त स्वरूप में होना चाहिए।

मैं निम्नलिखित कोड की कोशिश की और यह

dateFromNumbers = new Date(2020, 11, 15); 
dateFromString = new Date("2020 12 15"); 
alert(+dateFromNumbers == +dateFromString);​ 

इसके अलावा इसकी नहीं एक समस्या अक्टूबर के महीने के साथ शुरू सच देता है, यह दो अंकों में महीनों से कोई लेना है। अगर मैं फिर सितंबर के साथ एक ही विधि का प्रयास:

dateFromNumbers = new Date(2020, 8, 15); 
dateFromString = new Date("2020-09-15"); 
alert(+dateFromNumbers == +dateFromString);​ // This returns false 

लेकिन अगर मैं सितम्बर के लिए एकल अंक का उपयोग तो यह सच

dateFromNumbers = new Date(2020, 8, 15); 
dateFromString = new Date("2020-9-15"); 
alert(+dateFromNumbers == +dateFromString);​ // This returns true 

रिटर्न और दो अंकों के साथ प्रयोग के अंतरिक्ष सितंबर, तो यह सच रिटर्न अगर

dateFromNumbers = new Date(2020, 8, 15); 
dateFromString = new Date("2020 09 15"); 
alert(+dateFromNumbers == +dateFromString);​//This returns true 
3

यहां अन्य उत्तरों से एक सरल उत्तर ड्राइंग है।

तिथि अलग स्ट्रिंग प्रारूपों

  • अमानक दिनांकों
  • आरएफसी 2282 दिनांक
  • ES 5 दिनांकों

अधिकांश स्वरूपों को पहचानता स्थानीय दिनांक के रूप में व्याख्या कर रहे हैं

RFC 2282 के पृष्ठ 14 पर, हम देखते हैं:

दिन और समय-समय पर स्थानीय समय व्यक्त करना चाहिए।

गैर-मानक तिथियों को समान रूप से माना जाता है।

ऑफसेट एक अनुपस्थित समय क्षेत्र का मान "Z" है:

ES 5 प्रारूप यूटीसी

ES 5 कल्पना हम देखते हैं की section 15.9.1.15 में के रूप में व्याख्या की है।

"जेड" यूटीसी समय का प्रतिनिधित्व करता है।

अक्टूबर

ES के दसवें 5 स्वरूपित दिनांकों दो अंकों महीनों और दिनों की आवश्यकता है। मूल पोस्ट में महीनों और दिन शून्य-गद्देदार नहीं हैं। "2020-9-9" मान्य ईएस 5 दिनांक प्रतिनिधित्व नहीं है; यह एक गैर-मानक प्रारूप है, इसलिए इसका स्थानीय समय में व्याख्या किया गया है। "2020-10-10" एक वैध ES 5 दिनांक प्रतिनिधित्व है, इसलिए इसे यूटीसी में व्याख्या किया जाना चाहिए।

संभावित समाधानों

  • स्ट्रिंग निर्माता/Date.parse का उपयोग न करें!
  • विभाजक चरित्र बदलें ताकि प्रारूप ईएस 5 प्रारूप से मेल नहीं खा सके।
  • एक टाइमज़ोन निर्दिष्ट करें।
  • स्थानीय समय की तिथियां समायोजित करें। अगर उनके पास घंटे या मिनट हैं: date.setMinutes(date.getTimezoneOffset()); (यह काम करता है, वैसे भी)।
संबंधित मुद्दे