Ma solution conserve la même date quel que soit le fuseau horaire défini côté client. Peut-être que quelqu'un le trouvera utile.
Mon cas d'utilisation:
Je crée une application de tâches, où vous définissez la date de votre tâche. Cette date doit rester constante quel que soit le fuseau horaire dans lequel vous vous trouvez.
Exemple. Vous voulez appeler votre ami à 8 h le 25 juin.
Vous créez cette tâche 5 jours avant (20 juin) pendant que vous êtes en Chine.
Puis, le même jour, vous prenez l'avion pour New York pendant quelques jours.
Ensuite, le 25 juin, alors que vous êtes encore à New York, vous vous réveillez à 7h30 (ce qui signifie que vous devriez recevoir une notification de tâche dans 30 minutes (même s'il est 13h30 déjà en Chine où vous étiez lors de la création du tâche)
La tâche ignore donc le fuseau horaire. Cela signifie «Je veux le faire à 8 heures du matin, quel que soit le fuseau horaire dans lequel je serai».
Ce que je fais, c'est de dire «je suppose que vous êtes toujours dans le fuseau horaire de Londres - UTC».
Cela signifie - lorsque l'utilisateur choisit une date dans son fuseau horaire - je convertis cette date en la même date en UTC. c'est à dire. Vous choisissez 8 heures du matin en Chine, mais je le convertis à 8 heures du matin en UTC.
Ensuite - la prochaine fois que vous ouvrirez l'application - je lis la date enregistrée en UTC et la convertis à la même date dans votre fuseau horaire actuel - par exemple. Je convertis 8 h en UTC en 8 h dans le fuseau horaire de New York.
Cette solution signifie que la date peut signifier autre chose en fonction de l'endroit où vous la définissez et de l'endroit où vous la lisez, mais elle reste constante d'une manière qui vous donne l'impression que vous êtes toujours dans le même fuseau horaire.
Écrivons du code:
Premièrement - nous avons 2 fonctions principales pour la conversion de / vers UTC en ignorant le fuseau horaire:
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(),
);
}
Ensuite, je sauvegarde / lis cette date comme:
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
}