new Date () funktioniert in Chrome und Firefox unterschiedlich

94

Ich möchte eine Datumszeichenfolge in DateJavascript konvertieren. Verwenden Sie diesen Code:

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

'2013-02-27T17:00:00' ist die UTC-Zeit im JSON-Objekt vom Server.

Das Ergebnis des obigen Codes unterscheidet sich jedoch zwischen Firefox und Chrome:

Firefox kehrt zurück:

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

Chrome kehrt zurück:

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

Es ist 1 Tag anders, das richtige Ergebnis, das ich erwarten würde, ist das Ergebnis von Chrome.

Demo-Code: http://jsfiddle.net/xHtqa/2/

Wie kann ich dieses Problem beheben, um von beiden das gleiche Ergebnis zu erhalten?

cuongle
quelle
2
Ist das auf dem gleichen Computer?
Aaron Digulla
4
@ Sandeep der Hauptpunkt ist, dass Chrome Zeitzonenversatz hinzufügt, während Firefox dies nicht tut
Standardgebietsschema
3
@ CuongLe Haben Sie diese Frage gesehen: stackoverflow.com/questions/9062863/…
Standardgebietsschema
1
Es ist Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}für mich in beiden (Linux).
Marekful
1
Nitpicker-Ecke: «UTC-Zeit im JSON-Format» - JSON-Format? Genau genommen ist eine häufige Beschwerde über JSON, dass es überhaupt kein Datumsformat definiert.
Álvaro González

Antworten:

66

Das richtige Format für UTC wäre 2013-02-27T17:00:00Z(Z steht für Zulu Time). Anhängen, Zwenn nicht vorhanden, um die korrekte UTC-Datums- / Uhrzeitzeichenfolge zu erhalten.

Petr Abdulin
quelle
2
Vielen Dank. Das funktioniert. Aber es gibt ein Protokoll, das besagt, dass es in Zukunft veraltet sein wird !!!. Irgendeine Idee bitte?
Débora
1
Vielen Dank, ich habe zwei Tage mit diesem Problem gesessen, aber dieser Beitrag hat alles gelöst.
Piyal George
30

Ja, leider sind die Datumsanalyse-Algorithmen implementierungsabhängig. Aus der Spezifikation vonDate.parse (die von verwendet wirdnew Date ):

Der String kann abhängig vom Inhalt des Strings als Ortszeit, UTC-Zeit oder Zeit in einer anderen Zeitzone interpretiert werden. Die Funktion versucht zunächst, das Format des Strings gemäß den im Date Time String Format ( 15.9.1.15 ) angegebenen Regeln zu analysieren . Wenn der String nicht diesem Format entspricht, kann die Funktion auf implementierungsspezifische Heuristiken oder implementierungsspezifische Datumsformate zurückgreifen.

Verwenden Sie eine datetime-Zeichenfolge mit Zeitzoneninformationen, z . B., damit der DateKonstruktor (möglicherweise) die lokale Zeitzone nicht verwendet "2013-02-27T17:00:00Z". Es ist jedoch schwierig, ein Format zu finden, das von jedem Browser zuverlässig analysiert wird - das ISO-Format wird vom IE <8 nicht erkannt (siehe JavaScript: Welche Browser unterstützen das Parsen von ISO-8601-Datumszeichenfolgen mit Date.parse ). Verwenden Sie besser einen Unix-Zeitstempel, dh Millisekunden seit der Unix-Epoche , oder verwenden Sie einen regulären Ausdruck, um die Zeichenfolge in ihre Teile zu zerlegen und diese dann einzugeben Date.UTC.

Bergi
quelle
2
Aber die Spezifikation (15.9.1.15) sagt tatsächlich: "Der Wert eines fehlenden Zeitzonenversatzes ist" Z "" - daher sollte er NICHT implementierungsabhängig sein
sinelaw
12
OK, Korrektur. Sieht aus wie ein Fehler in der ES5.1-Spezifikation - die Absicht war, ISO-8601 zu entsprechen, wobei fehlendes Z die Ortszeit bedeutet (Chrome entspricht also ES5.1, Firefox & IE entspricht ISO-8601)
sinelaw
@sinelaw: Danke, dass du diesen Punkt weiter untersucht hast. Unabhängig davon, was in der Spezifikation angegeben ist, machen [alte] Browser es immer noch anders :-)
Bergi
2
Die seltsame Verwendung von Date.Parse vs. new Date hat das Problem behoben, bei dem Chrome das Datum in die lokale Zeitzone konvertierte, anstatt es als bereits in der lokalen Zeitzone zu behandeln.
KingOfHypocrites
1
@ KingOfHypocrites - das ist etwas seltsam, da das Aufrufen des Date-Konstruktors mit einer Zeichenfolge mit der Verwendung von Date.parse identisch sein soll .
RobG
4

Ich habe hier eine Sache gefunden. Es scheint, dass die native Firefox Inspector Console einen Fehler aufweist: Wenn ich "new Date ()" im nativen Inspector ausführe, wird ein Datum mit falscher Zeitzone und GMT-Gebietsschema angezeigt, aber in der Firebug Extension Console wird derselbe Befehl ausgeführt, das Datum gezeigt verwendet meine korrekte Zeitzone (GMT-3: 00).

Sergio Abreu
quelle
-2

Versuchen Sie es mit moment.js. Es geht sehr gut und in ähnlicher Weise mit allen Browsern. kommt mit vielen Formatierungsoptionen. Verwenden Sie moment ('date'). format ("") anstelle von New Date ('date').

MSIslam
quelle
-2

Es wurde festgestellt, dass FireFox nicht das gleiche Ergebnis wie Chrome zurückgibt. Das Format, das Sie in kendo.toString für das Datum verwenden, macht anscheinend einen Unterschied.

Das letzte Konsolenergebnis ist das, was ich brauchte:

Geben Sie hier die Bildbeschreibung ein

MJ Storm
quelle