Meine Lösung behält das Datum bei, unabhängig davon, welche Zeitzone auf der Clientseite eingestellt ist. Vielleicht findet es jemand nützlich.
Mein Anwendungsfall:
Ich erstelle eine ToDo-App, in der Sie das Datum Ihrer Aufgabe festlegen. Dieses Datum sollte unabhängig von der Zeitzone, in der Sie sich befinden, konstant bleiben.
Beispiel. Sie möchten Ihren Freund am 25. Juni um 8 Uhr morgens anrufen.
Sie erstellen diese Aufgabe 5 Tage vor (20. Juni), während Sie in China sind.
Am selben Tag fliegen Sie dann für einige Tage nach New York.
Dann, am 25. Juni, während Sie noch in New York sind, wachen Sie um 7:30 Uhr auf (was bedeutet, dass Sie innerhalb von 30 Minuten eine Benachrichtigung über die Aufgabe erhalten sollten (obwohl es bereits 13:30 Uhr in China ist, wo Sie sich bei der Erstellung des waren Aufgabe)
Die Aufgabe ignoriert also die Zeitzone. Es bedeutet "Ich möchte es um 8 Uhr morgens in der Zeitzone tun, in der ich mich befinde".
Ich sage: "Ich nehme an, Sie sind immer in der Londoner Zeitzone - UTC."
Was es bedeutet ist - wenn der Benutzer ein Datum in seiner Zeitzone auswählt - konvertiere ich dieses Datum in das gleiche Datum in UTC. dh. Sie wählen 8 Uhr in China, aber ich konvertiere es in 8 Uhr in UTC.
Dann - beim nächsten Öffnen der App - lese ich das in UTC gespeicherte Datum und konvertiere es in das gleiche Datum in Ihrer aktuellen Zeitzone - z. Ich konvertiere 8 Uhr in UTC in 8 Uhr in der New Yorker Zeitzone.
Diese Lösung bedeutet, dass das Datum etwas anderes bedeuten kann, je nachdem, wo Sie es einstellen und wo Sie es lesen. Es bleibt jedoch so konstant, dass es sich so anfühlt, als ob Sie sich immer in derselben Zeitzone befinden.
Schreiben wir einen Code:
Erstens - wir haben zwei Hauptfunktionen zum Konvertieren von / nach UTC, wobei die Zeitzone ignoriert wird:
export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
const timestamp = Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds(),
);
return new Date(timestamp);
}
export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
return new Date(
utcDate.getUTCFullYear(),
utcDate.getUTCMonth(),
utcDate.getUTCDate(),
utcDate.getUTCHours(),
utcDate.getUTCMinutes(),
utcDate.getUTCSeconds(),
utcDate.getUTCMilliseconds(),
);
}
Dann speichere / lese ich dieses Datum wie folgt:
function saveTaskDate(localDate: Date) {
// I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
api.saveTaskDate(utcDate);
}
function readTaskDate(taskUtcDate: Date) {
// I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);
// this date will have the same calendar day as the one you've picked previously
// no matter where you were saving it and where you are now
}