Warum zeigt moment.js UTC immer das falsche Datum an? Zum Beispiel von der Entwicklerkonsole von Chrome:
moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Beide werden "2013-07-17" zurückgeben, warum wird der 17. statt der 18. zurückgegeben , der übergeben wurde.
Aber wenn ich momentjs ohne utc benutze:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Ich bekomme "2013-07-18" zurück , was ich auch erwarte, wenn ich moment.js UTC benutze.
Bedeutet dies, dass wir bei Verwendung von moment.js UTC nicht das richtige Datum erhalten können?
toString()
nachformat()
(es bereits einen String zurückgibt).Antworten:
Standardmäßig analysiert MomentJS die Ortszeit. Wenn nur eine Datumszeichenfolge (ohne Uhrzeit) angegeben wird, wird standardmäßig Mitternacht verwendet.
In Ihrem Code erstellen Sie ein lokales Datum und konvertieren es dann in die UTC-Zeitzone (tatsächlich wechselt die Momentinstanz in den UTC-Modus ). Wenn sie formatiert wird, wird sie (abhängig von Ihrer Ortszeit) vorwärts oder vorwärts verschoben rückwärts.
Wenn die lokale Zeitzone UTC + N ist (N ist eine positive Zahl) und Sie eine Nur-Datum-Zeichenfolge analysieren, erhalten Sie das vorherige Datum.
Hier einige Beispiele zur Veranschaulichung (mein lokaler Zeitversatz ist UTC + 3 während der Sommerzeit):
Wenn Sie möchten, dass die Datums- / Uhrzeitzeichenfolge als UTC interpretiert wird, sollten Sie dies explizit angeben:
oder, wie Matt Johnson in seiner Antwort erwähnt, können ( und sollten ) Sie es zunächst als UTC-Datum analysieren
moment.utc()
und die Formatzeichenfolge als zweites Argument einschließen, um Mehrdeutigkeiten zu vermeiden.Um umgekehrt ein UTC-Datum in ein lokales Datum umzuwandeln, können Sie die folgende
local()
Methode verwenden:quelle
new Date('07-18-2013 UTC')
Beachten Sie, dass dies in IE8 nicht funktioniert, wenn Sie sich darum kümmern.Beide
Date
undmoment
analysieren standardmäßig die Eingabezeichenfolge in der lokalen Zeitzone des Browsers. DiesDate
steht jedoch manchmal im Widerspruch dazu. Wenn die Zeichenfolge speziellYYYY-MM-DD
mit Bindestrichen versehen ist oder wenn dies der Fall istYYYY-MM-DD HH:mm:ss
, wird sie als Ortszeit interpretiert . Im Gegensatz zuDate
,moment
wird immer konsistent darüber , wie es analysiert.Die richtige Methode zum Analysieren eines Eingabemoments als UTC in dem von Ihnen angegebenen Format lautet wie folgt:
Siehe diese Dokumentation .
Wenn Sie es dann für die Ausgabe anders formatieren möchten, gehen Sie folgendermaßen vor:
Sie müssen nicht
toString
explizit anrufen .Beachten Sie, dass es sehr wichtig ist, das Eingabeformat anzugeben. Ohne dieses Datum wird ein Datum wie das
01-04-2013
möglicherweise entweder als 4. Januar oder als 1. April verarbeitet, abhängig von den Kultureinstellungen des Browsers.quelle
moment
auf der Konsole ist nicht sehr nützlich. Sie sehen sich wahrscheinlich eine der internen Eigenschaften an. Sie sollten es formatieren, bevor Sie die Ergebnisse überprüfen. Zum Beispielmoment.utc().format()
odermoment().format()
.new Date('2010-12-12')
gibt mirDate {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}
in FF 38.0.5. Nur um zu kontextualisieren, was "in der Ortszeit" genau bedeutet - in diesem Fall scheint es zu bedeuten, "Date
wird angenommen, dass sich eine zonenlose Zeitzeichenfolge in UTC befindet und nach der Ortszeit analysiert wird."d.getUTCDate()
=12
undd.getDate()
=11
'2012-12-12'
ist UTC b / c, es hat ein ISO-Format, wird aber'December 12, 2012'
sogar'2012/12/12'
mit einer lokalen Zeitzone in ES5 analysiert), aber Sie haben mich geschlagen. So großartig, dass ES6 sie alle lokal macht [sagte er sarkastisch]. Termine sind ein Schmerz, (c) Advent of Dates