Ich versuche, beide Datumszeichenfolgen an zu übergeben new Date(t)
.
Ich gehe davon aus, dass beide Zeichenfolgen dieselbe Zeit darstellen. Wenn ich die Zeit weglasse, sollte es dann nicht Mitternacht dieses Tages sein?
Aber während,
new Date("2016-02-16 00:00")
Rückgabe 2016-02-16, Mitternacht, Ortszeit wie erwartet,
new Date("2016-02-16")
gibt 2016-02-16, Mitternacht UTC zurück, was falsch ist oder zumindest nicht das, was ich erwartet habe, wenn man bedenkt, wie die anderen Zeichenfolgen analysiert werden.
Ich würde es verstehen, wenn beide das gleiche Verhalten hätten, ob es die Zeit als Ortszeit oder als UTC zurückgeben soll, aber es scheint sehr inkonsistent zu sein, warum sie verschiedene Dinge wie diese zurückgeben.
Um dieses Problem zu umgehen, kann ich immer dann, wenn ich auf ein Datum stoße, für das es keinen entsprechenden Zeitstempel gibt, "00:00" anhängen, um ein konsistentes Verhalten zu erzielen. Dies scheint jedoch ziemlich fragil zu sein.
Ich erhalte diesen Wert von einem INPUT-Element vom Typ 'datetime-local', daher scheint es besonders inkonsistent zu sein, dass ich einen von einem Seitenelement zurückgegebenen Wert umgehen muss.
Mache ich etwas falsch oder sollte ich etwas anders machen?
quelle
2016-02-16 00:00
- Dies scheint überhaupt nicht die gültige Zeit zu sein. ecma-international.org/ecma-262/6.0/… , aber selbst nachdem Sie esT
dort platziert haben, verhält es sich tatsächlich andersAntworten:
In der ES5.1-Spezifikation heißt es:
Es heißt auch:
Da das Format ein
T
Trennzeichen zwischen Datum und Uhrzeit erfordert , gehen die gültigen Zeiten an UTC:... während in node.js eine ungültige Zeit (ohne das T-Trennzeichen) zur implementierungsspezifischen Ortszeit zu gehen scheint:
Beachten Sie, dass ES6 dies im selben Teil der Dokumentation geändert hat, in den es geändert wurde:
Die Freude , Veränderungen zu brechen .
Bearbeiten
Gemäß TC39 soll die Spezifikation so interpretiert werden, dass Datums- und Zeitzeichenfolgen ohne Zeitzone (z. B. "2016-02-16T00: 00: 00") als lokal (gemäß ISO 8601) behandelt werden, jedoch nur Datumszeichenfolgen (z "2016-02-16") als UTC (was nicht mit ISO 8601 vereinbar ist).
quelle
Gemäß den Spezifikationen :
Und Datum Zeit Zeichenfolgenformate akzeptieren
2016-02-16
als gültiges DatumSo
2016-02-16
übersetzt zu2016-02-16T00:00:00.000Z
.Das andere Datum
2016-02-16 00:00
entspricht nicht dem Format und daher ist die Analyse implementierungsspezifisch. Anscheinend werden solche Daten als lokale Zeitzonen behandelt, und Ihr Beispieldatum gibt je nach Zeitzone unterschiedliche Werte zurück:Zusammenfassung:
NaN
anstatt zu versuchen , nicht konforme Daten zu analysieren. Testen Sie einfach Ihren Code in Internet Explorer 11;)quelle
Möglicherweise stoßen Sie auf Unterschiede zwischen ES5- und ES6-Implementierungen und Ihrem erwarteten Ergebnis. Per Date.parse bei MDN ist "insbesondere bei verschiedenen ECMAScript-Implementierungen, bei denen Zeichenfolgen wie" 2015-10-12 12:00:00 "als NaN, UTC oder lokale Zeitzone analysiert werden können" von Bedeutung.
Zusätzliche Tests in Firefox 44 und IE 11 ergaben, dass beide ein
new Date("2016-02-16 00:00")
Datumsobjekt für zurückgeben , für das NaN beim Versuch, einen Datumskomponentenwert abzurufen, NaN zurückgibt und dessen toString-Wert "Ungültiges Datum" (nicht "NaN") ist. Daher kann das Anhängen von "00:00, um ein konsistentes Verhalten zu erzielen" in verschiedenen Browsern leicht zu Problemen führen.Wie in anderen Antworten erwähnt, wird
new Date("2016-02-16")
standardmäßig ein Zeitzonenversatz von Null verwendet, der Mitternacht UTC anstelle von lokal erzeugt.quelle
Pro
DateParser::Parse()
V8-Quellcode für Chrome.quelle
Es fügt den Zeitzonenversatz zum hinzu
00:00
new Date("2016-02-16")
AusgängeTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Meine Zeitzone ist IST mit einem Versatzwert (in Minuten)
+330
, daher wurden 330 Minuten zu 00:00 hinzugefügt.Wie pro ECMA-262, Abschnitt 20.3.3.2 Date.parse (string)
Wenn Sie die Zeiteinheiten explizit
new Date("2016-02-16 00:00")
festlegen, wird set that ashours
andminutes
,Ansonsten wie hier in 2 0.3.1.16 angegeben
quelle
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
Wo behauptet es, dass es dasselbe sein muss?