2012-11-13 10 views
28

पर जावास्क्रिप्ट दिनांक अमान्य है मैं फोनगैप-आधारित आईओएस ऐप पर काम कर रहा हूं, जो पहले से ही एंड्रॉइड के लिए किया गया है। निम्नलिखित लाइनें एंड्रॉइड के लिए ठीक काम कर रही हैं लेकिन आईओएस के लिए नहीं। क्यूं कर? Android के लिएआईओएस

var d = new Date("2015-12-31 00:00:00"); 
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear(); 

परिणाम: iOS पर

31.11 2015 

परिणाम:

NaN. NaN NaN 

अंतर कहाँ से आ रही है?

उत्तर

65

आपकी दिनांक स्ट्रिंग new Date के साथ काम करने के लिए निर्दिष्ट प्रारूप में नहीं है। Spec में एकमात्र प्रारूप a simplified version of ISO-8601 है, लेकिन यह केवल ES5 में जोड़ा गया था और इसलिए समर्थन स्पर्श और जा सकता है। आपकी स्ट्रिंग उस प्रारूप में नहीं है, लेकिन यह वास्तव में करीब है।

आप एक T करने के लिए स्पेस बदलते हैं तो आप कल्पना करते रहेंगे:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(' ', 'T')); 

(मैं आप वास्तव में एक स्ट्रिंग replace कॉल उपयोग नहीं कर रहे शाब्दिक, इसलिए यह सोचते हैं रहा हूँ।)

ध्यान दें कि ES5 विनिर्देश में त्रुटि हुई थी जिसे ES2015 (ES6) में ठीक किया गया था: स्ट्रिंग पर कोई टाइमज़ोन सूचक नहीं होने पर क्या होता है। आईएसओ -8601 में, कोई संकेतक का मतलब "स्थानीय समय" नहीं है, लेकिन ईएस 5 विनिर्देश ने कहा कि यह Z (जीएमटी) पर डिफ़ॉल्ट है। उन्होंने इसे ES2015 विनिर्देशन में तय किया, लेकिन दुर्भाग्यवश कुछ जावास्क्रिप्ट इंजन ES5 विनिर्देशों का पालन करते थे और अन्य ने आईएसओ -8601 (और अब ES2015) का पालन किया, इसलिए ठोस क्रॉस-ब्राउज़र समर्थन के लिए, आपको टाइमज़ोन सूचक शामिल करना होगा क्योंकि अन्यथा आप नहीं पता है कि इसका जीएमटी या स्थानीय समय के रूप में व्याख्या किया जाएगा। आपको जीएमटी या +/- के लिए Z का उपयोग ऑफसेट करने के लिए HH:MM के बाद Z का उपयोग करने की अनुमति है। (CST जैसे संक्षेपों की अनुमति नहीं है, क्योंकि उनके लिए कोई मानक नहीं है।)

यदि वे अभी तक इसका समर्थन नहीं करते हैं, भले ही यह अनियंत्रित है, तो YYYY/MM/DD HH:MM:SS के लिए सार्वभौमिक समर्थन है। तो:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(/-/g, '/')); 
+0

चीयर्स तुम्हें वापस मिल जाएगा, टी चाल कर रही है ! –

+1

@ फिलिप सिगफ्राइड: बढ़िया, खुशी हुई जिसने मदद की! –

+1

@NULL: मैंने कभी ऐसा जावास्क्रिप्ट इंजन नहीं देखा है जिसने इसका समर्थन नहीं किया है।आईई 6 और ऊपर, फ़ायरफ़ॉक्स के हर संस्करण मैंने कभी देखा है, क्रोम के हर संस्करण, ओपेरा के हर संस्करण। ** लेकिन **, किसी को हमेशा लक्षित वातावरण पर परीक्षण करना चाहिए (चाहे कुछ "मानक" है या नहीं, दुख की बात है)। –

5

मैं आपको क्यों नहीं बता सकता। हो सकता है क्योंकि आईओएस जावास्क्रिप्ट डेट फ़ंक्शन के साथ-साथ एंड्रॉइड का समर्थन नहीं करता है, या एक अलग प्रारूप का समर्थन करता है?

लेकिन मैं तुम्हें एक समाधान दे सकते हैं:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"), 
    d = new Date(s[0], s[1], s[2], 0, 0, 0); 

console.log(d); 

var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"), 
    d = new Date(s[0], s[1], s[2], s[3], s[4], s[5]); 

console.log(d); 
+0

@dda मैं इसे कोशिश करते हैं और – samouray

1

मेरे लिए var d = new Date("2015/12/31 00:00:00"); वर्क्स के साथ प्रयास करें।

-1

इसके अलावा मेरे लिए

var d = new Date("2015/12/31 00:00:00"); 

काम करता है :)

धन्यवाद

+0

'टी' के साथ स्थान को बदले बिना मेरे लिए काम नहीं करता है – zanderwar