Moje rozwiązanie utrzymuje tę samą datę bez względu na strefę czasową ustawioną po stronie klienta. Może ktoś uzna to za przydatne.
Mój przypadek użycia:
Tworzę aplikację do zrobienia, w której ustawiasz datę swojego zadania. Ta data powinna pozostać stała bez względu na strefę czasową, w której się znajdujesz.
Przykład. Chcesz zadzwonić do przyjaciela o 8 rano 25 czerwca.
Utworzysz to zadanie 5 dni przed (20 czerwca) podczas pobytu w Chinach.
Następnie tego samego dnia lecisz na kilka dni do Nowego Jorku.
Następnie, 25 czerwca, gdy jesteś jeszcze w Nowym Jorku, budzisz się o 7:30 rano (co oznacza, że powinieneś otrzymać powiadomienie o zadaniu za 30 minut (nawet o 13:30 już w Chinach, gdzie byłeś podczas tworzenia zadanie)
Zadanie polega więc na ignorowaniu strefy czasowej. Oznacza to: „Chcę to zrobić o 8 rano w dowolnej strefie czasowej, w której będę”.
To, co robię, to powiedzmy: „Zakładam, że zawsze jesteś w strefie czasowej Londynu - UTC”.
Oznacza to, że - gdy użytkownik wybierze datę w swojej Strefie czasowej - przekonwertuję tę datę na tę samą datę w UTC. to znaczy. Wybierasz 8 rano w Chinach, ale przeliczam go na 8 rano w UTC.
Następnie - następnym razem, gdy otworzysz aplikację - odczytam datę zapisaną w UTC i przekonwertuję ją na tę samą datę w twojej bieżącej strefie czasowej - np. Konwertuję 8 rano w UTC na 8 rano w strefie czasowej Nowego Jorku.
To rozwiązanie oznacza, że data może oznaczać coś innego, w zależności od tego, gdzie jesteś podczas ustawiania i gdzie ją czytasz, ale pozostaje stała w taki sposób, że „czuje się”, jakbyś zawsze był w tej samej strefie czasowej.
Napiszmy kod:
Po pierwsze - mamy 2 główne funkcje do konwersji z / na UTC ignorujące strefę czasową:
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(),
);
}
Następnie zapisuję / czytam tę datę jak:
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
}