Behebung von MomentJS interpretiert Datumsangaben als Ortszeit
Problem:
Du lebst in einer Nicht-UTC-Zeitzone. Datumsangaben, die mit MomentJS geparst werden wie
moment("2017-01-01")werden als Ortszeit interpretiert anstelle von UTC (wie es aufgrund des Z im ISO8601-Zeitstempel angemessen wäre) und daher führt der Versuch, sie zu formatieren, zu einem verschobenen Zeitstempel:
moment("2017-01-01").toDate().toISOString()
// "2016-12-31T23:00:00.000Z" <-- Um 1 Stunde verschoben (MEZ - UTC)
Dies verursacht Probleme, da oft das ursprüngliche Datum nicht erhalten bleibt: Im obigen Beispiel wäre das korrekte Datum 2017-01-01, aber es ist stattdessen 2016-12-31.
Lösung 1: Moment zwingen, das Datum als UTC zu parsen
moment.utc("2017-01-01").toDate().toISOString()
// "2017-01-01T00:00:00.000Z" <-- Korrekt
Lösung 2: Den Zeitzonen-Offset manuell abziehen
let m = moment("2017-01-01");
// Differenz zwischen Zeitzone und UTC abziehen
m = m.subtract(m.toDate().getTimezoneOffset(), 'minutes');
// m.toDate().toISOString() === "2017-01-01T01:00:00.000Z" - KORREKT
Verwende dies, wenn Lösung 1 nicht funktioniert oder du den Parsing-Code nicht ändern kannst: Diese Lösung funktioniert auch, wenn das Datum bereits geparst wurde.
VERWENDE NICHT
new Date().getTimezoneOffset() // VERWENDE DIES NIE! KÖNNTE DEN FALSCHEN OFFSET VERWENDEN!
da es den Zeitzonen-Offset des aktuellen Datums anstelle des von MomentJS geparsten Datums verwendet. Offensichtlich ist dies in Ländern mit Sommerzeit falsch, da Daten je nach Datum unterschiedliche Offsets haben können. Außerdem kann in seltenen Fällen die Zeitzone des Client-Rechners zwischenzeitlich aufgrund von Reisen etc. geändert worden sein und daher möglicherweise nicht den korrekten Offset darstellen.