- A nova especificação Temporal API, que substitui de forma fundamental as limitações do objeto Date no JavaScript, chegou ao ECMAScript Stage 4 após 9 anos de desenvolvimento
- O Temporal oferece tipos imutáveis, suporte explícito a fuso horário e calendário e precisão em nanossegundos, eliminando a ambiguidade e os erros do Date tradicional
- Bloomberg, Igalia, Microsoft, Google e Mozilla colaboraram no desenho da especificação e na implementação, viabilizando a cooperação entre múltiplos motores com a biblioteca compartilhada em Rust
temporal_rs
- O Temporal oferece suporte preciso para cálculos temporais e tratamento internacionalizado de calendários por meio de tipos detalhados como ZonedDateTime, Instant, PlainDate/Time e Duration
- Esse padrão, que resolve problemas acumulados ao longo de 30 anos, é visto como um caso de sucesso de colaboração e inovação aberta no ecossistema JavaScript
Os problemas de tratamento de tempo no JavaScript e a chegada do Temporal
- O objeto Date existente foi basicamente portado do Date do Java em 1995 e, por conta de mutabilidade, cálculo inconsistente de meses e parsing ambíguo, tem sido fonte de bugs por décadas
- Ex.: ao usar
setMonth, ocorrem erros no cálculo de fim de mês; ao fazer parsing de strings parecidas com ISO, os resultados variam entre navegadores
- À medida que as aplicações web ficaram mais complexas a partir da década de 2010, as limitações do Date se agravaram
- Desenvolvedores tentaram contornar o problema com bibliotecas externas como Moment.js, mas isso trouxe aumento do tamanho do bundle e custo de manutenção
- Em 2017, Maggie Johnson-Pint apresentou a proposta do Temporal ao TC39, dando início à discussão de padronização
Colaboração entre TC39 e a indústria
- O Temporal começou no Stage 1 em 2018 e, ao longo de 9 anos, chegou ao Stage 4 (padronização)
- A Bloomberg participou ativamente para resolver problemas de fuso horário e precisão em ambientes JavaScript de grande escala
- Requisitos: fusos horários personalizados, precisão histórica baseada na IANA e precisão em nanossegundos
- Houve colaboração com Igalia, Microsoft, Google e Mozilla no desenho da especificação e na implementação
- Vários engenheiros atuaram como champions, incluindo Philipp Dunkel, Ujjwal Sharma, Philip Chimento, Shane Carr e Justin Grant
Principais tipos e recursos do Temporal
- Temporal.ZonedDateTime: representação imutável de data e hora com fuso horário, calendário e ajuste de DST explícitos
- Ex.: na transição de DST em Londres, se
01:30 não existir, o valor é ajustado automaticamente para 02:30
- Temporal.Instant: representação de um instante absoluto sem fuso horário nem calendário, com precisão em nanossegundos
- Permite converter o mesmo instante para vários fusos horários
- PlainDate / PlainTime / PlainDateTime / PlainYearMonth / PlainMonthDay: tipos de “relógio de parede” sem fuso horário
- Adequados para exibição ou cálculo simples de datas e horários
- Temporal.Duration: representa intervalos de tempo e permite conversão entre várias unidades (
total({ unit: "second" }))
- Suporte a calendários: executa corretamente operações em calendários não gregorianos, como o calendário hebraico
Implementação e processo de padronização
- O Temporal é a maior adição de especificação da história do ECMAScript, com cerca de 4.500 casos de teste
- Foi desenvolvida a implementação compartilhada em Rust
temporal_rs, usada em conjunto por V8, Boa e outros motores
- Vantagens: menor barreira de entrada, manutenção de longo prazo mais fácil e melhor qualidade de código
- Ao longo de 2024 e 2025, o
temporal_rs passou em 100% dos testes e foi avaliado como um caso bem-sucedido de colaboração entre múltiplos motores
Situação de suporte e próximos desafios
- O Temporal já é suportado em Firefox 139, Chrome/Edge 144 e TypeScript 6.0 Beta
- O Safari está na fase de Technical Preview, e o Node.js 26 está previsto
- O próximo desafio é a integração com APIs da web
- Ex.: suporte a tipos
Temporal em elementos de formulário como <input type="date">
- Também se discute a possibilidade de substituir
DOMHighResTimeStamp (com exemplo de uso de Temporal.Now.instant())
Resultados da colaboração e da inovação aberta
- O Temporal foi concluído como um padrão por meio de 9 anos de colaboração entre múltiplas organizações, com participação de
- Microsoft, Google, Mozilla, Bloomberg, Igalia e Boa, entre outros
- O
temporal_rs é visto como um caso de sucesso de modelo de infraestrutura compartilhada, demonstrando
- redução de custos de implementação duplicada, maior consistência e aceleração da inovação
- O Temporal é avaliado não apenas como uma melhoria de API, mas como prova de colaboração do ecossistema JavaScript para resolver dívida técnica de longo prazo
- Após 30 anos, o JavaScript finalmente passa a ter uma API moderna de data e hora
7 comentários
A complexidade do cálculo do tempo tem muito mais origem na filosofia da humanidade, na precisão da astronomia e na cultura do que em um problema de formato. Fazer contas é fácil até só com
long. Historicamente, há muitos pontos na linha do tempo em que 1 + 1 não é 2, e isso se deve em grande parte a calendários, quase como o I Ching, que variam conforme a posição, como o ângulo do Sol e da superfície terrestre. Nesses casos, o calendário lunissolar coreano sequer chegou a ser discutido.E isso é definido pelo Instituto Coreano de Pesquisa em Astronomia e Ciências Espaciais.
Finalmente! Que alegria!!
Finalmente!!
ZonedDateTime...? Você por acaso...!
Finalmente
time.hde C ->java.util.Datedo Java ->Datedo JSjoda-time do Java -> JSR 310 ->
java.time-> moment.js ->
Temporaldo JSEntão foi esse o fluxo.
Comentários do Hacker News
A distinção entre instant e datetime baseado em calendário praticamente evita os erros comuns que aconteciam com
DateÉ um pouco verboso, mas ainda assim é muito melhor do que ser chamado às 3 da manhã para corrigir um bug de DST
Um problema aberto em 2012 acabou finalmente entrando na biblioteca padrão como solução
A discussão relacionada pode ser vista neste tópico do Google Groups
fromisoformatagora parece extremamente pouco intuitivoAntes eu usava
ciso8601, mas depois que entrou no padrão, tudo ficou muito mais simples e estávelEu compartilho código entre cliente e servidor, então tento separar estritamente dados e lógica
Quero manter todos os dados em JSON puro para facilitar serialização/desserialização, mas os objetos Temporal são instâncias de classe com propriedades de função, o que é inconveniente
Acho melhor uma abordagem como a do date-fns, em que funções puras são aplicadas a objetos apenas de dados
JSON.parseO desenvolvedor precisa reconstruir manualmente o objeto correto a partir da string ISO
Automatizar isso traz o risco de lidar com tipos errados
O exemplo de reviver para
Temporal.Instantna documentação pode servir de referênciaJSON.parse/stringifyé uma questão comumMas acho que a escolha da equipe do Temporal foi a correta. Na lógica de data e hora, segurança de tipos é mais importante do que a abordagem simples de dados + funções
Vincular as operações ao objeto evita que um
PlainDateseja tratado por engano comoZonedDateTimeEm algo como tRPC, basta adicionar uma camada fina para converter nas bordas com
Temporal.from()etoString()É um pouco incômodo, mas acho melhor do que abrir mão da segurança de tipos
Datedo JavaScript têm o mesmo problemaDate.toJSONexiste, mas ao fazer parse de JSON é preciso converter a string de volta paraDateCom Temporal é igual, e o date-fns no fim das contas também lida com instâncias nativas de
Date.toString()eTemporal.from()JSON.parsepara criar objetos Temporal automaticamenteAssim como com
Date, o certo é tratar isso explicitamente dessa formaParabéns a todos os champions que trabalharam nisso por tanto tempo
Foi divertido trabalhar em
temporal_rsnos últimos anosComo a proposta radical do JavaScript surgiu em 2018, fico curioso se a abordagem do Java influenciou em alguma medida
O TC39 consulta precedentes de outras linguagens, mas chega a um consenso otimizado para JavaScript
Acho que esta API é a implementação mais refinada já projetada por especialistas em JS ao longo de 9 anos
DateIsso também pode ser visto neste tópico do HN
Datedo Java para C” é engraçadaPorque o próprio
util.Datedo Java já era praticamente um port da APItime.hdo CAgora parece que o Safari virou o sucessor espiritual do IE
O problema do IE não era lentidão, e sim o fato de ter parado enquanto estava em posição dominante
Hoje o Chrome está no lugar do império, e Safari e Firefox são mais necessários do que nunca
O verdadeiro problema é o aumento de sites feitos só para Chrome
DurationVeja a documentação da MDNDuration