2014-08-29 9 views
7

में अजीब पात्र हैं, मैंने एक सुपर अजीब चीज़ में भाग लिया है जो स्पष्ट रूप से toLocaleString में आईई-विशिष्ट है।आईई के toLocaleString के परिणाम

आईई कंसोल विंडो में:

new Date("2014-08-28T20:51:09.9190106Z").toLocaleString(); 
"‎8‎/‎28‎/‎2014‎ ‎1‎:‎51‎:‎09‎ ‎PM" 

अब, मैन्युअल कि स्ट्रिंग टाइप स्ट्रिंग के रूप और क्या विधि लौटे से तुलना:

"8/28/2014 1:51:09 PM" === new Date("2014-08-28T20:51:09.9190106Z").toLocaleString(); 
false 

है किसी को भी किसी भी विचार क्यों यह है आईई में हो रहा है? यह क्रोम में नहीं होता है।

अद्यतन: अधिक उदाहरण:

new Date("8/28/2014 1:51:09 PM") 
[date] Thu Aug 28 2014 13:51:09 GMT-0700 (Pacific Daylight Time)[date] Thu Aug 28 2014 13:51:09 GMT-0700 (Pacific Daylight Time) 

new Date(new Date("2014-08-28T20:51:09.9190106Z").toLocaleString()) 
[date] Invalid Date[date] Invalid Date 
+0

आईई का कौन सा संस्करण? – danwellman

+0

इंटरनेट एक्सप्लोरर 11. –

+0

देखें [टेड बिकनेल - इंटरनेट एक्सप्लोरर 11 के साथ एक खराब तिथि: जावास्क्रिप्ट डेट स्ट्रिंग्स में नए यूनिकोड वर्णों के साथ समस्या] (https://www.csgpro.com/blog/2016/08/a-bad- डेट-इन-इंटरनेट-एक्सप्लोरर -11-परेशानी-नई-यूनिकोड-वर्ण-इन-जावास्क्रिप्ट-डेट-स्ट्रिंग्स) – KyleMit

उत्तर

7

पहले, पृष्ठभूमि का एक सा: IE11 कार्यान्वित ECMA-402 ECMAScript अंतर्राष्ट्रीयकरण एपीआई Date.prototype.toLocaleString (साथ ही toLocaleDateString और toLocaleTimeString) को format पर Intl.DateTimeFormat पर कॉल के रूप में परिभाषित किया गया है। जैसे, d.toLocaleString()

Intl.DateTimeFormat(undefined, { 
    year: 'numeric', 
    month: 'numeric', 
    day: 'numeric', 
    hour: 'numeric', 
    minute: 'numeric', 
    second: 'numeric' 
}).format(d) 

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

इससे दूर लेना यह है कि आपको अपने आवेदन में कुछ स्थिर मूल्य के साथ toLocaleString एपीआई के आउटपुट की तुलना करने पर भरोसा नहीं करना चाहिए। इसके अलावा, दिनांक d, Date.parse(d.toLocaleString()) कभी-कभी काम कर सकता है लेकिन अन्य लोगों को लोकेल के आधार पर नहीं, इसलिए यह भी इससे बचने के लिए सबसे अच्छा है।

इसके साथ, एन-यूएस अपेक्षाकृत स्थिर है और अधिकांश भाग ब्राउज़र (अब के लिए) उस मूल प्रारूप पर सहमत हैं। हालांकि, आईई तिथि के चारों ओर बिडरेक्शनल नियंत्रण पात्रों को सम्मिलित करता है। यह डिज़ाइन द्वारा है इसलिए आउटपुट टेक्स्ट अन्य टेक्स्ट के साथ संयोजित होने पर ठीक से बह जाएगा। यह विशेष रूप से महत्वपूर्ण है जब एलटीआर और आरटीएल सामग्री को मिलाकर एलटीआर पाठ के साथ एक स्वरूपित आरटीएल तिथि को जोड़ना।

+0

जो हमने किया है, पहले हमारे परीक्षणों को बदलना 'toLocaleString' के विशिष्ट आउटपुट पर निर्भर नहीं है, और उसके बाद बाद में केवल कोड में बजाए हमारे नॉकआउट टेम्पलेट बाध्यकारी में' toLocaleString' का उपयोग करने के लिए, और छोड़ने के लिए कोड ऑब्जेक्ट्स शेष कोड में वास्तविक तिथियों के रूप में। –

5

यह पता चला आप उन्हें देख नहीं सकते हैं, लेकिन IE के Date.toLocaleString जाहिरा तौर पर सहित उस में बाएँ-से-सही के निशान है (U + 200E):

8<200E>/<200E>21<200E>/2014<200E> <200E> 9<200E>:<200E>16<200E>:<200E>:18<200E> <200E>AM 

भयानक। मुझे लगता है कि आईई में एक बग जमा करने का समय है?

+0

आईई टीम ईमेल के माध्यम से लगी हुई है। अगर मुझे कुछ और जानकारी मिलती है तो इसे अपडेट कर देगा। –

+0

आईई टीम से ब्रायन ने एक उत्तर जोड़ा जो अधिक विशिष्ट है, इसलिए मेरा जवाब अब सबसे अच्छा जवाब नहीं है :) –

0

मुझे यह मेरे आईई 11 में नहीं दिख रहा है, इसलिए यह आईई या आपकी मशीन में आपकी सेटिंग्स/कॉन्फ़िगरेशन के साथ कुछ करने के लिए हो सकता है। मेरे लिए परिणाम है:

"‎28‎/‎08‎/‎2014‎ ‎21‎:‎51‎:‎09" === new Date("2014-08-28T20:51:09.9190106Z").toLocaleString(); true

आप कॉपी-पेस्ट दिनांक स्ट्रिंग किसी वेब पृष्ठ से निर्माता को पारित कर दिया था?

मुझे नहीं लगता कि आईई टीम इस स्तर पर एक बग के रूप में यह स्वीकार करेंगे क्योंकि यह स्पष्ट रेप्रो नहीं है कदम

+0

जहां मैं काम करता हूं, वे इसे स्वीकार कर सकते हैं :) हम आईई, आदि का उपयोग करके क्विनीट में यूनिट परीक्षणों में इसे दोबारा कर सकते हैं, हमारे संगठन में हर कोई कर सकते हैं। –

1

कृपया अन्य ब्राउज़र में http://jsbin.com/mehowehase/1/edit?html,js,console

var dt = new Date(); 
var x = dt.toLocaleDateString(); 
console.log("length : "+x.length); 
var arr = x.split("/"); 
console.log("month : "+parseInt(arr[0],10)); 
IE में

एक्स की लंबाई ऊपर में है 14 लेकिन 9 को देखो। यह जॉन की टिप्पणी का समर्थन करता है कि आईई बाएं से दाएं अंक जोड़ रहा है। यह निश्चित रूप से मेरे लिए एक बग की तरह दिखता है।

+0

हमें लगता है कि यह एक बग है, आईई/एज टीम वास्तव में ऊपर प्रतिक्रिया देने वाला व्यक्ति था, और "आपको लगता है कि यह बहुत स्पष्ट है लेकिन ब्राउज़रों को बड़ी संख्या में छूट के साथ अनुमति दी जाती है और वे कौन से प्रारूपों का समर्थन करते हैं प्रारूप। यह डिजाइन द्वारा है - ग्रह के चारों ओर सभी लोकेशंस और भाषाओं के साथ, यह निर्दिष्ट करना काफी बोझिल होगा और अद्यतित रखना बहुत मुश्किल होगा। " –

4

उपयोग

Str.replace(/[^ -~]/g,'') 

यह अवांछित विशेष वर्ण निकाल देंगे।

+0

यह बुरा नहीं है, लेकिन मार्ज़ अब मिर्ज है, जो जर्मनी में एक मान्य महीना नाम है – Devid

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