fundo
O Date
objeto JavaScript rastreia o tempo no UTC internamente, mas normalmente aceita entrada e produz saída no horário local do computador em que está sendo executado. Possui muito poucas facilidades para trabalhar com o horário em outros fusos horários.
A representação interna de um Date
objeto é um número único, representando o número de milissegundos decorridos desde então 1970-01-01 00:00:00 UTC
, sem considerar os segundos bissextos. Não há fuso horário ou formato de string armazenado no próprio objeto Date. Quando várias funções do Date
objeto são usadas, o fuso horário local do computador é aplicado à representação interna. Se a função produzir uma sequência, as informações de localidade do computador poderão ser levadas em consideração para determinar como produzir essa sequência. Os detalhes variam de acordo com a função e alguns são específicos da implementação.
As únicas operações que o Date
objeto pode realizar com fusos horários não locais são:
Ele pode analisar uma string contendo um deslocamento numérico do UTC de qualquer fuso horário. Ele usa isso para ajustar o valor que está sendo analisado e armazena o equivalente ao UTC. A hora local original e o deslocamento não são mantidos no Date
objeto resultante . Por exemplo:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
Em ambientes que implementaram a API de Internacionalização do ECMASCript (também conhecida como "Intl"), um Date
objeto pode produzir uma sequência específica de localidade ajustada para um determinado identificador de fuso horário. Isso é realizado através da timeZone
opção toLocaleString
e suas variações. A maioria das implementações suporta identificadores de fuso horário da IANA, como 'America/New_York'
. Por exemplo:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
A maioria dos ambientes modernos oferece suporte ao conjunto completo de identificadores de fuso horário da IANA ( consulte a tabela de compatibilidade aqui ). No entanto, lembre-se de que o único identificador necessário para ser suportado pelo Intl é 'UTC'
, portanto, você deve verificar cuidadosamente se precisa oferecer suporte a navegadores mais antigos ou ambientes atípicos (por exemplo, dispositivos IoT leves).
Bibliotecas
Existem várias bibliotecas que podem ser usadas para trabalhar com fusos horários. Embora eles ainda não possam fazer com que o Date
objeto se comporte de maneira diferente, eles normalmente implementam o banco de dados de fuso horário da IANA padrão e fornecem funções para usá-lo em JavaScript. Bibliotecas modernas usam os dados de fuso horário fornecidos pela API Intl, mas as bibliotecas mais antigas geralmente têm sobrecarga, especialmente se você estiver executando em um navegador da Web, pois o banco de dados pode ficar um pouco grande. Algumas dessas bibliotecas também permitem reduzir seletivamente o conjunto de dados, pelo horário em que os fusos horários são suportados e / ou pelo intervalo de datas com o qual você pode trabalhar.
Aqui estão as bibliotecas a serem consideradas:
Bibliotecas baseadas em Intl
O novo desenvolvimento deve escolher uma dessas implementações, que dependem da API Intl para seus dados de fuso horário:
Bibliotecas Não Intl
Essas bibliotecas são mantidas, mas carregam o fardo de empacotar seus próprios dados de fuso horário, que podem ser bastante grandes.
* Embora Moment e Moment-Timezone tenham sido recomendados anteriormente, a equipe do Moment agora prefere que os usuários escolham o Luxon para um novo desenvolvimento.
Bibliotecas descontinuadas
Essas bibliotecas foram oficialmente descontinuadas e não devem mais ser usadas.
Propostas futuras
A proposta temporal do TC39 visa fornecer um novo conjunto de objetos padrão para trabalhar com datas e horas no próprio idioma JavaScript. Isso incluirá suporte para um objeto com reconhecimento de fuso horário.