Mi solución mantiene la fecha igual sin importar la zona horaria establecida en el lado del cliente. Quizás alguien lo encuentre útil.
Mi caso de uso:
Estoy creando una aplicación de tareas, donde estableces la fecha de tu tarea. Esta fecha debe permanecer constante sin importar en qué zona horaria se encuentre.
Ejemplo. Desea llamar a su amigo a las 8 am el 25 de junio.
Crea esta tarea 5 días antes (20 de junio) mientras estás en China.
Luego, el mismo día, vuelas a Nueva York por unos días.
Luego, el 25 de junio, mientras todavía está en Nueva York, se despierta a las 7:30 a.m. (lo que significa que debe recibir una notificación de la tarea en 30 minutos (aunque sea la 1:30 p.m., ya en China, donde estaba cuando creó el tarea)
Entonces la tarea es ignorar la zona horaria. Significa 'Quiero hacerlo a las 8 a.m. en cualquier zona horaria en la que esté'.
Lo que hago es decir 'supongo que siempre estás en la zona horaria de Londres - UTC'.
Lo que significa es que, cuando el usuario elige alguna fecha en su zona horaria, convierto esta fecha en la misma fecha en UTC. es decir. Eliges las 8 am en China, pero lo convierto a las 8 am en UTC.
Luego, la próxima vez que abra la aplicación, leo la fecha guardada en UTC y la convierto a la misma fecha en su zona horaria actual, por ejemplo. Convierto las 8 am en UTC a las 8 am en la zona horaria de Nueva York.
Esta solución significa que la fecha puede significar algo más dependiendo de dónde se encuentre al configurarla y dónde la esté leyendo, pero permanece constante de una manera que 'se siente' como si siempre estuviera en la misma zona horaria.
Escribamos un código:
Primero, tenemos 2 funciones principales para convertir de / a UTC ignorando la zona horaria:
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(),
);
}
Luego, guardo / leo esta fecha como:
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
}