La mia soluzione mantiene la data uguale indipendentemente dal fuso orario impostato sul lato client. Forse qualcuno lo troverà utile.
Il mio caso d'uso:
Sto creando un'app todo, in cui hai impostato la data della tua attività. Questa data dovrebbe rimanere costante, indipendentemente dal fuso orario in cui ti trovi.
Esempio. Vuoi chiamare il tuo amico alle 8 del mattino del 25 giugno.
Questa attività viene creata 5 giorni prima (20 giugno) mentre si è in Cina.
Quindi, lo stesso giorno, voli a New York per alcuni giorni.
Quindi, il 25 giugno, mentre sei ancora a New York, ti svegli alle 7:30 (il che significa che dovresti ricevere la notifica dell'attività in 30 minuti (anche se sono le 13:30 già in Cina dove eri quando hai creato il compito)
Quindi l'attività ignora il fuso orario. Significa "Voglio farlo alle 8 del mattino in qualunque fuso orario sarò".
Quello che faccio è dire "Suppongo che tu sia sempre nel fuso orario di Londra - UTC".
Ciò significa che - quando l'utente sceglie una data nel suo fuso orario - converto questa data nella stessa data in UTC. vale a dire. Scegli le 8 del mattino in Cina, ma le converto alle 8 del mattino in UTC.
Quindi - la prossima volta che apri l'app - ho letto la data salvata in UTC e la converto nella stessa data nel tuo fuso orario corrente - ad es. Converto le 8:00 in UTC alle 8:00 nel fuso orario di New York.
Questa soluzione significa che la data può significare qualcos'altro a seconda di dove ti trovi quando la imposti e dove la stai leggendo, ma rimane costante in un modo in cui "ti senti" come se fossi sempre nello stesso fuso orario.
Scriviamo un po 'di codice:
Primo: abbiamo 2 funzioni principali per la conversione da / in UTC ignorando il fuso orario:
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(),
);
}
Quindi, salvo / leggo questa data come:
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
}