Moment: Verwirrung über moment.utz mit MySQL DateTime

Erstellt am 18. Apr. 2016  ·  3Kommentare  ·  Quelle: moment/moment

Einen kleinen Test habe ich hier geschrieben: https://jsfiddle.net/vrdhcuey/1/

Wenn wir von der Datenbank anfordern, erhalten wir eine DATETIME von der MySQL-Datenbank zurück (ursprünglich auf die Standard-UTC-Zeitzone eingestellt, aber auch mit Europa/Dublin als Zeitzone getestet) von 2016-04-22T16:00:00.000Z - das heißt die Enddatumszeit unseres Objektes ist Freitag, 22. April, um 16 Uhr. Dies ist in Wirklichkeit zeitzonenlos, da wir nur sagen, dass die Veranstaltung an einem bestimmten Datum um 16 Uhr enden kann, aber dieses Datum könnte in GMT oder BST fallen.

In dem bereitgestellten Test möchten wir die Dauer zwischen jetzt und diesem Datum abrufen. Es ist jedoch immer eine Stunde frei. Der einzige Weg, dies zu umgehen, besteht darin, das .000Z vom Ende des Datetime-Strings zu entfernen. Ich habe auch versucht, moment.tz zu verwenden, habe aber das gleiche Ergebnis (dh in diesem Test ist leftTime4 das richtige Verhalten, das wir erwarten). Ich hätte jedoch erwartet, dass leftTime2 so funktioniert, wie es ist.

Kann jemand bitte diese Verwirrung aufklären oder treffe ich hier auf einen Fehler?

Hilfreichster Kommentar

Der ISO8601-Standard legt fest, dass Datumsangaben, die auf Z enden, als UTC interpretiert werden. Der Moment, in dem Ihre Zeit verstrichen ist, ist daher die Umrechnung der Zeit von UTC in die lokale. So kommst du zu deiner Ein-Stunden-Frei-Situation.

Wenn Sie das Z vorübergehend ignorieren möchten (die Zeit als lokal interpretieren), können Sie ein Format angeben, das das Z nicht aufgreift, indem Sie Folgendes tun:

moment('2016-04-22T16:00:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSS').format()

Wenn Sie weitere Informationen zu den verschiedenen Parsing-Modi wünschen, kann dieser Abschnitt der Anleitungen hilfreich sein: http://momentjs.com/guides/#/parsing/local -utc-zone/

Alle 3 Kommentare

Der ISO8601-Standard legt fest, dass Datumsangaben, die auf Z enden, als UTC interpretiert werden. Der Moment, in dem Ihre Zeit verstrichen ist, ist daher die Umrechnung der Zeit von UTC in die lokale. So kommst du zu deiner Ein-Stunden-Frei-Situation.

Wenn Sie das Z vorübergehend ignorieren möchten (die Zeit als lokal interpretieren), können Sie ein Format angeben, das das Z nicht aufgreift, indem Sie Folgendes tun:

moment('2016-04-22T16:00:00.000Z', 'YYYY-MM-DDTHH:mm:ss.SSS').format()

Wenn Sie weitere Informationen zu den verschiedenen Parsing-Modi wünschen, kann dieser Abschnitt der Anleitungen hilfreich sein: http://momentjs.com/guides/#/parsing/local -utc-zone/

Richtig - die eigentliche Lösung ist also, nicht Z von Ihrem Backend auszugeben, wenn Sie nicht wirklich UTC meinen.

@ mj1856 Ja, habe es versucht, aber ich frage mich, ob das Problem bei Sequlize und nicht bei MySQL selbst liegt - wenn wir die Abfrage direkt gegen die DB ausführen, wird nur eine einfache DATETIME mit YYYY-MM-DD HH:MM:SS ausgegeben, wie sie gespeichert ist . Das Ändern der Zeitzone der DB schien keinen Unterschied zu machen. Wie auch immer, das Obige scheint es vorerst zu beheben, wir werden sehen, ob es hält, wenn wir wieder in GMT gehen :bomb:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen