2013-02-27 121 views
80

में अलग काम करती है मैं, जावास्क्रिप्ट द्वारा Date को दिनांक स्ट्रिंग परिवर्तित इस कोड का उपयोग करना चाहते हैं:नई तिथि() Chrome और Firefox

var date = new Date('2013-02-27T17:00:00'); 
alert(date); 

'2013-02-27T17:00:00' सर्वर से JSON ऑब्जेक्ट में UTC समय है।

लेकिन इसके बाद के संस्करण कोड का परिणाम फ़ायरफ़ॉक्स और क्रोम के बीच अलग है:

फ़ायरफ़ॉक्स रिटर्न:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time) 

क्रोम रिटर्न:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

यह 1 दिन अलग है, सही परिणाम मैं उम्मीद है कि क्रोम से परिणाम होगा।

डेमो कोड: http://jsfiddle.net/xHtqa/2/

कैसे मैं दोनों से एक ही परिणाम प्राप्त करने के लिए इस समस्या को ठीक कर सकते हैं?

+2

कि एक ही कंप्यूटर पर है:

पिछले सांत्वना परिणाम है कि मैं क्या जरूरत है? –

+0

@defaultlocale: नवीनतम संस्करण 25.0.1364.97 मीटर –

+0

@AaronDigulla: हाँ, उसी लैपटॉप पर फ़ायरफ़ॉक्स और क्रोम क्रोम में मेरे लिए –

उत्तर

58

यूटीसी के लिए सही प्रारूप 2013-02-27T17:00:00Z (जेड ज़ुलू समय के लिए है) होगा। सही यूटीसी डेटाटाइम स्ट्रिंग प्राप्त करने के लिए मौजूद नहीं होने पर Z संलग्न करें।

+1

धन्यवाद। यह काम। लेकिन एक लॉग कह रहा है, यह भविष्य में बहिष्कृत हो जाएगा !!! कोई विचार कृपया? –

+0

लाइफ सेवर ....... – Skumar

+0

बहुत बहुत धन्यवाद, मैं इस मुद्दे के साथ दो दिनों तक बैठा हूं, लेकिन इस पोस्ट ने सबकुछ हल किया। –

25

हाँ, दुर्भाग्य से डेट-पार्सिंग एल्गोरिदम कार्यान्वयन-निर्भर हैं। specification of Date.parse (जो new Date द्वारा प्रयोग किया जाता है) से:

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

Date constructor बनाने के लिए (शायद) स्थानीय टाइमज़ोन का उपयोग करें, टाइमज़ोन जानकारी के साथ डेटाटाइम स्ट्रिंग का उपयोग करें, उदा। "2013-02-27T17:00:00Z"। हालांकि, प्रत्येक ब्राउज़र द्वारा विश्वसनीय रूप से समर्थित प्रारूप को ढूंढना मुश्किल है - आईएसओ प्रारूप आईई < 8 द्वारा पहचाना नहीं गया है (JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse देखें)। बेहतर, एक यूनिक्स टाइमस्टैम्प का उपयोग करें, यानी unix epoch के बाद मिलीसेकंड, या अपने हिस्सों में स्ट्रिंग को तोड़ने के लिए एक विनियामक अभिव्यक्ति का उपयोग करें और फिर उन्हें Date.UTC में फ़ीड करें।

+2

लेकिन spec (15.9.1.15) वास्तव में कहता है: "अनुपस्थित समय क्षेत्र ऑफसेट का मान" Z "है" - इसलिए यह लागू नहीं होना चाहिए – sinelaw

+12

ठीक है, सुधार। ऐसा लगता है [ES5.1 spec में गलती] (https://bugs.ecmascript.org/show_bug.cgi?id=112) - इरादा आईएसओ -8601 से मेल खाना था जहां लापता ज़ेड का मतलब स्थानीय समय था (इसलिए क्रोम मैचों ES5.1, फ़ायरफ़ॉक्स और आईई मैच आईएसओ -8601) – sinelaw

+0

@ सिनलॉ: उस बिंदु की और जांच के लिए धन्यवाद। हालांकि, भले ही spec कहता है, [पुराने] ब्राउज़र अभी भी इसे अलग-अलग कर रहे हैं :-) – Bergi

2

मुझे यहां एक चीज़ मिली। ऐसा लगता है कि मूल फ़ायरफ़ॉक्स इंस्पेक्टर कंसोल में एक बग हो सकता है: यदि मैं मूल निरीक्षक में "नई तिथि()" चलाता हूं, तो यह गलत टाइमज़ोन, जीएमटी लोकेल के साथ एक तिथि दिखाता है, लेकिन फायरबग एक्सटेंशन कंसोल में एक ही कमांड चलाता है, दिखाया गया दिनांक मेरे सही टाइमज़ोन (जीएमटी -3: 00) का उपयोग करता है।

0

moment.js का उपयोग करने का प्रयास करें। यह बहुत अच्छी तरह से और सभी ब्राउज़रों के साथ इसी तरह से चला जाता है। कई स्वरूपण विकल्पों के साथ आता है। पल ('डेट') का उपयोग करें। नई तिथि ('तिथि') के बजाय प्रारूप ("")

-1

नोट किया गया कि फ़ायरफ़ॉक्स क्रोम के समान परिणाम नहीं लौटा रहा था। ऐसा लगता है कि आप जिस प्रारूप में kendo.toString में उपयोग करते हैं, वह एक फर्क पड़ता है।

enter image description here

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

  • कोई संबंधित समस्या नहीं^_^