Il toLocaleString di IE ha caratteri strani nei risultati

Mi sono imbattuto in una cosa super strano che apparentemente è IE specifico in toLocaleString date.

Nella window della console IE:

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

Ora, digitare la string manualmente come una string e confrontarla con quello che il metodo restituito:

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

Qualcuno ha idea di come si verifica in IE? Ciò non si verifica in Chrome.

Aggiornamento: altri esempi:

 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 

In primo luogo, un po 'di background: IE11 ha implementato l'API di internazionalizzazione ECMAScript ECMA-402 che ha ridefinito Date.prototype.toLocaleString (così come toLocaleDateString e toLocaleTimeString ) come chiamate per format su Intl.DateTimeFormat . Come tale, d.toLocaleString() è equivalente a

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

Potreste pensare che questo sia abbastanza esplicito, ma i browser consentono una grande quantità di margine di manovra con i formati che supportno e quali caratteri compongono il formato. Questo è di progettazione – con tutte le localizzazioni e le lingue in tutto il pianeta, precisando che questo sarebbe molto gravoso e molto difficile da tenere aggiornati. Per questo motivo non puoi aspettarvi di poter confrontare i risultati di toLocaleString tra i browser o addirittura aspettare che lo stesso browser continui a dare lo stesso risultato dal rilascio alla release. Poiché i dati locali di base si modificano (forse perché l'abitudine locale è cambiata, o sono disponibili più dati o sono aggiunti formati migliori), così anche il formato restituito da questa API.

La presa di forza da questo è che si dovrebbe cercare di non fare affidamento su confrontare l'output delle API toLocaleString con un valore statico nella tua applicazione. Inoltre, dato una data d , Date.parse(d.toLocaleString()) può funzionare a volte, ma non altri a seconda della locale, quindi è meglio evitare questo anche.

Detto questo, l'en-US è relativamente stabile e per la maggior parte i browsers (per adesso) concordano su quel formato di base. Tuttavia, IE inserisce i caratteri di controllo bidirezionale attorno alla data. Questo è con il disegno in modo che il text dell'output andrà correttamente quando concatenato con un altro text. Ciò è particolarmente importnte quando si mescola il contenuto LTR e RTL come la concatenazione di una data RTL formattata con il text LTR.

Si scopre che non riesci a vederli, ma Data.toLocaleString di IE apparentemente comprende marchi da sinistra a destra (U + 200E):

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

eccezionale. Immagino che sia giunto il momento di presentare un bug a IE?

Si prega di guardare 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)); 

Nel precedente la lunghezza di x è 14 in IE ma 9 in altri browser. Questo support il commento di John che IE sta aggiungendo segnali da sinistra a destra. Questo sicuramente sembra un bug per me.

Uso

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

Ciò rimuove i caratteri speciali indesiderati.

Non vedo questo nel mio IE11 in modo che potrebbe essere qualcosa a che fare con le impostazioni / config in IE o la tua macchina. Per me il risultato è:

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

Hai copiato-incolla la string di date passata al constructor da una pagina web?

Non credo che il team di IE lo accetterà come un bug in questa fase perché non ha ripercussioni chiare