Behebung von MomentJS interpretiert Datumsangaben als Ortszeit

English Deutsch

Problem:

Du lebst in einer Nicht-UTC-Zeitzone. Datumsangaben, die mit MomentJS geparst werden wie

moment_parse_example.js
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_local_time.js
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_parse.js
moment.utc("2017-01-01").toDate().toISOString()
// "2017-01-01T00:00:00.000Z" <-- Korrekt

Lösung 2: Den Zeitzonen-Offset manuell abziehen

moment_subtract_offset.js
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

moment_wrong_offset.js
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.


Check out similar posts by category: Javascript