2013-02-27 12 views
80

voglio convertire data stringa Date da JavaScript, utilizzare questo codice:new Date() funziona in modo diverso in Chrome e Firefox

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

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

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

Firefox restituisce:

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

Chrome ritorna:

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

E 'diverso 1 giorno, il risultato corretto I si aspetterebbe sia il risultato di Chrome.

codice Demo: http://jsfiddle.net/xHtqa/2/

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

+2

È che sullo stesso computer? –

+0

@defaultlocale: l'ultima versione 25.0.1364.97 m –

+0

@AaronDigulla: sì, firefox e chrome sullo stesso laptop –

risposta

58

Il formato corretto per UTC è 2013-02-27T17:00:00Z (Z è per Zulu Time). Aggiungi Z se non presente per ottenere la stringa datetime UTC corretta.

+1

Grazie. Questo funziona. Ma c'è un log che dice, sarà deprecato in futuro !!!. Qualche idea per favore? –

+0

Life Saver ....... – Skumar

+0

grazie mille, sono stato seduto con questo problema per due giorni, ma questo post ha risolto tutto. –

25

Sì, sfortunatamente gli algoritmi di analisi delle date dipendono dall'implementazione. Dalla specification of Date.parse (che è usato da new Date):

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

Per fare in modo che Date constructor non utilizzi il fuso orario locale, utilizzare 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 attendibile da ogni browser: il formato ISO non viene riconosciuto da IE < 8 (vedere JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse). È preferibile utilizzare un timestamp unix, vale a dire millisecondi dal unix epoch oppure utilizzare un'espressione regulare per suddividere la stringa nelle sue parti e quindi inviarle in Date.UTC.

+2

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

+12

OK, correzione. Sembra un [errore nella specifica ES5.1] (https://bugs.ecmascript.org/show_bug.cgi?id=112) - l'intenzione era quella di abbinare ISO-8601 dove Z mancante significa ora locale (quindi le partite di Chrome ES5.1, Firefox e IE corrispondono a ISO-8601) – sinelaw

+0

@sinelaw: Grazie per ulteriori indagini su questo punto. Tuttavia, indipendentemente da ciò che afferma la specifica, i [vecchi] browser lo stanno ancora facendo diversamente :-) – Bergi

2

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

0

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 New Date ('date')

-1

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 console è quello che mi serviva:

enter image description here

Problemi correlati