Minha solução mantém a data a mesma, independentemente do fuso horário definido no lado do cliente. Talvez alguém ache útil.
Meu caso de uso:
Estou criando um aplicativo de tarefas, onde você define a data da sua tarefa. Essa data deve permanecer constante, independentemente do fuso horário em que você estiver.
Exemplo. Você quer ligar para seu amigo às 8 da manhã de 25 de junho.
Você cria esta tarefa 5 dias antes (20 de junho) enquanto estiver na China.
Então, no mesmo dia, você voa para Nova York por alguns dias.
Então, em 25 de junho, enquanto você ainda está em Nova York, você acorda às 7:30 da manhã (o que significa que você deve receber uma notificação de tarefa em 30 minutos) tarefa)
Portanto, a tarefa está ignorando o fuso horário. Significa 'Eu quero fazer isso às 8 da manhã em qualquer fuso horário em que estarei'.
O que faço é dizer "presumo que você esteja sempre no fuso horário de Londres - UTC".
O que isso significa é - quando o usuário escolhe uma data em seu fuso horário - eu converto essa data para a mesma data no UTC. ie Você escolhe 8 da manhã na China, mas eu a converto para 8 da manhã no UTC.
Então - da próxima vez que você abrir o aplicativo - eu li a data salva no UTC e a converto para a mesma data no seu fuso horário atual - por exemplo. Eu converto 8 da manhã no UTC para 8 da manhã no fuso horário de Nova York.
Essa solução significa que a data pode significar outra coisa, dependendo de onde você está ao defini-la e de onde está lendo, mas permanece constante de uma maneira que parece que você está sempre no mesmo fuso horário.
Vamos escrever um código:
Primeiro - temos 2 funções principais para converter de / para UTC, ignorando o fuso horário:
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(),
);
}
Em seguida, salvei / li esta data 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
}