new Date () funziona in modo diverso in Chrome e Firefox


94

Voglio convertire la stringa della data in DateJavaScript, usa questo codice:

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

'2013-02-27T17:00:00' è l'ora UTC nell'oggetto JSON dal server.

Ma il risultato del codice sopra è diverso tra Firefox e Chrome:

Firefox restituisce:

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

Chrome restituisce:

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

È diverso 1 giorno, il risultato corretto che mi aspetterei è il risultato di Chrome.

Codice demo: http://jsfiddle.net/xHtqa/2/

Come posso risolvere questo problema per ottenere lo stesso risultato da entrambi?


2
È sullo stesso computer?
Aaron Digulla

4
@Sandeep il punto principale è che Chrome aggiunge l'offset del fuso orario mentre Firefox no
impostazione locale predefinita


1
È Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}per me in entrambi (Linux).
marekful

1
L'angolo di Nitpicker: «ora UTC in formato JSON» - formato JSON? Precisamente, una lamentela comune su JSON è che non definisce alcun formato di data.
Álvaro González

Risposte:


66

Il formato corretto per UTC sarebbe 2013-02-27T17:00:00Z(Z sta per Zulu Time). Aggiungi Zse non presente per ottenere la stringa data / ora UTC corretta.


2
Grazie. Funziona. Ma c'è un registro che dice, sarà deprecato in futuro !!!. Qualche idea per favore?
Débora

1
grazie mille, sono due giorni che ho questo problema, ma questo post ha risolto tutto.
Piyal George,

30

Sì, sfortunatamente gli algoritmi di analisi della data dipendono dall'implementazione. Dalla specifica diDate.parse (che è usata da new Date):

La stringa può essere interpretata come un'ora locale, un'ora UTC o un'ora in un altro fuso orario, a seconda del contenuto della stringa. La funzione prima tenta di analizzare il formato della stringa in base alle regole chiamate in Formato stringa data ora ( 15.9.1.15 ). Se la stringa non è conforme a quel formato, la funzione può ricorrere a qualsiasi euristica specifica dell'implementazione o formati di data specifici dell'implementazione.

Per fare in modo che il Datecostruttore non usi (forse) il fuso orario locale, usa una stringa datetime con informazioni sul fuso orario, ad es "2013-02-27T17:00:00Z". Tuttavia, è difficile trovare un formato che sia analizzato in modo affidabile da ogni browser: il formato ISO non è riconosciuto da IE <8 (vedi JavaScript: quali browser supportano l'analisi della stringa di data ISO-8601 con Date.parse ). Meglio, usa un timestamp unix, cioè millisecondi dall'epoca unix , o usa un'espressione regolare per scomporre la stringa nelle sue parti e poi inserirle in Date.UTC.


2
Ma la specifica (15.9.1.15) in realtà dice: "Il valore di un offset di fuso orario assente è" Z "" - quindi NON dovrebbe dipendere
dall'implementazione

12
OK, correzione. Sembra un errore nelle specifiche ES5.1 : l'intenzione era di abbinare ISO-8601 dove Z mancante significa ora locale (quindi Chrome corrisponde a ES5.1, Firefox e IE corrispondono a ISO-8601)
sinelaw

@sinelaw: Grazie per aver approfondito questo punto. Tuttavia, indipendentemente da ciò che afferma la specifica, i [vecchi] browser continuano a farlo in modo diverso :-)
Bergi

2
Stranamente, l'utilizzo di Date.Parse vs. new Date ha risolto il problema che stavo avendo in cui Chrome converteva la data nel fuso orario locale invece di trattarla come già nel fuso orario locale.
KingOfHypocrites

1
@ KingOfHypocrites: è un po 'strano in quanto si suppone che chiamare il costruttore Date con una stringa sia lo stesso che usare Date.parse .
RobG

4

Ho trovato una cosa qui. Sembra che la Firefox Inspector Console nativa possa avere un bug: se eseguo "new Date ()" nell'Inspector nativo, mostra una data con fuso orario errato, GMT locale, ma eseguendo lo stesso comando nella Firebug Extension Console, la data mostrato utilizza il mio fuso orario corretto (GMT-3: 00).


-2

Prova a utilizzare moment.js. Va molto bene e in modo simile con tutti i browser. viene fornito con molte opzioni di formattazione. usa il momento ('data'). format ("") invece di Nuova data ('data')


-2

Ho notato che FireFox non restituiva lo stesso risultato di Chrome. Sembra che il formato che usi in kendo.toString per la data faccia la differenza.

L'ultimo risultato della console è ciò di cui avevo bisogno:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.