Date sai de cena e Temporal chega
(piccalil.li)- Aponta a incompletude e inconsistência do objeto
Dateexistente no JavaScript e apresenta a API Temporal como substituta Datefunciona como um objeto mutável (mutable object), destoando do conceito real de data, e tem problemas estruturais como erros de parsing e limitações no tratamento de fuso horárioTemporaloferece um novo modelo de tratamento de data e hora baseado em imutabilidade, incluindo classes detalhadas comoPlainDate,ZonedDateTimeeDuration- Os métodos de
Temporalnão modificam o objeto existente e retornam um novo objeto, permitindo operações de encadeamento mais claras e seguras Temporalestá atualmente no estágio 3 de padronização (Stage 3) e já conta com suporte experimental em navegadores modernos como Chrome e Firefox
Problemas do objeto Date no JavaScript
- O construtor
Datecausa confusão por causa de regras de parsing inconsistentes e indexação pouco intuitiva- Exemplo: o mês (
month) começa em 0, mas o dia (day) e o ano (year) começam em 1 - Strings como
"99"são interpretadas como 1999, enquanto"100"vira o ano 0100, mostrando a falta de consistência
- Exemplo: o mês (
Datefoi projetado com foco em tempo (time) e é armazenado internamente como timestamp Unix (em milissegundos)- O suporte a fuso horário (time zone) é limitado e não reconhece horário de verão (DST) nem calendários não gregorianos
- Por essas limitações, é comum depender de grandes bibliotecas de terceiros como Moment.js e date-fns, o que pode levar a queda de desempenho
O conflito entre imutabilidade e referência
- No JavaScript, valores primitivos (primitive) são imutáveis e armazenados como o próprio valor, enquanto objetos (object) são armazenados por referência (
reference) e podem ser alterados Dateé um objeto criado por meio de um construtor (constructor), portanto é mutável- Exemplo: ao chamar
setMonth()ousetDate(), o objeto original é alterado diretamente
- Exemplo: ao chamar
- Isso causa mudanças de valor inesperadas entre variáveis que referenciam o mesmo objeto
- Exemplo: se uma função recebe
todaycomo argumento e modifica a data internamente, otodayoriginal também é alterado
- Exemplo: se uma função recebe
Temporal: a nova API de data e hora
Temporalé um objeto de namespace (namespace object), não um construtor, com uma estrutura semelhante à deMath- Principais componentes:
PlainDate,PlainDateTime,PlainTime,ZonedDateTime,Duration,Nowetc.
- Principais componentes:
Temporal.Nowretorna o momento atual em vários formatosplainDateISO()→ data no formato ISOzonedDateTimeISO()→ data e hora com fuso horário
- Os objetos de
Temporaloferecem um conjunto de métodos mais claro- Operações explícitas por unidade com
add({ days: 1 }),subtract({ years: 2 })etc. - Mantêm a imutabilidade ao retornar um novo objeto sem modificar o anterior
- Operações explícitas por unidade com
Como Temporal funciona e suas vantagens
- Os objetos de
Temporalcontinuam sendo objetos, mas seguem um padrão de uso imutável intencional- Exemplo:
today.add({ days: 1 })retorna um novo objeto de data, e otodayoriginal não é alterado
- Exemplo:
- Oferece uma sintaxe mais concisa e clara em comparação com
Date- Exemplo:
const today = Temporal.Now.plainDateISO(); console.log(`Tomorrow will be ${ today.add({ days: 1 }) }. Today is ${ today }.`); // 결과: Tomorrow will be 2026-01-01. Today is 2025-12-31.
- Exemplo:
- Atende a demandas modernas como definição de fuso horário, cálculo de períodos e manutenção do formato ISO
- Com encadeamento de métodos como
add,subtract,sinceeuntil, é possível expressar cálculos complexos de data de forma concisa
Situação da padronização e perspectivas
Temporalchegou ao estágio 3 da proposta do ECMAScript (Stage 3), fase em que a implementação nos navegadores é recomendada- O suporte experimental já começou em Chrome e Firefox, e outros navegadores também devem adotá-lo
- Os desenvolvedores já podem participar da melhoria da especificação por meio de testes e feedback
Datecontinuará existindo, mas a perspectiva é que Temporal se torne a forma padrão de lidar com datas no futuro- O texto conclui dizendo que “deveria ter sido substituído em 1995, mas mesmo agora Temporal.Now é o momento ideal”
1 comentários
Comentários do Hacker News
Este texto trata de vários comportamentos absurdos do construtor
Datedo JavaScriptEm especial, explica o problema de o formato
'YYYY-MM-DD'ser interpretado como meia-noite em UTC, fazendo a data ficar deslocada em um dia nos fusos locaisOriginalmente, na ISO 8601, quando não há fuso especificado, deveria ser considerado o horário local, mas por um erro durante a redação da especificação do ES5 isso passou a ser tratado como “Z” (UTC)
Depois tentaram corrigir no ES2015, mas como inúmeros sites dependiam do comportamento antigo e incorreto, a mudança foi revertida por causa da compatibilidade com a web
Para mais detalhes, veja a seção Broken Parser
'strict datetime', como'use strict'Assim daria para aplicar o comportamento correto de forma opcional, sem criar problemas de incompatibilidade com código legado
Ou então poderia existir algo como
import Date from 'browser:date', trazendo um objeto global corrigido por meio de um módulo internoNão faz sentido que um valor que representa apenas uma data, como aniversário, mude por causa do fuso
Lembro que antigamente o Outlook salvava aniversários com fuso horário, então toda vez que eu mudava de país o aniversário andava um dia
Mas haveria alternativa? Forçar ramificações por versão de navegador, como na época do IE5, provavelmente teria sido ainda pior
Tenho muita inveja de como Rails e Ruby tratam tempo e datas
APIs como
Time.current.in_time_zone('America/Los_Angeles') + 3.days - 4.months + 1.hoursão intuitivas e poderosasRuby sobrecarrega o objeto Time como um único objeto consistente, então quase não é preciso se preocupar com conversões ou casting
Fico pensando como seria bom poder escrever algo simples como
new Date().add({ days: 1 })no JSTambém é discutível se sobrecarregar a biblioteca padrão é mesmo a melhor abordagem
É uma pena que o Safari ainda não ofereça suporte à API Temporal
Espero que isso aconteça no ano que vem
O
Datedo JavaScript tem muitos problemas, mas acho que o fato de ser um objeto em si não é um grande problemaSeria melhor se fosse imutável, mas não é surpresa que um objeto mutável seja alterado
Dateque eu estava usandoO verdadeiro perigo da mutabilidade aparece em mudanças não locais
É incômodo que a API Temporal não trate de forma alguma informações sobre segundos bissextos (
leap second)Quero criar uma ferramenta JS para cálculos astronômicos, mas conversões para UTC exigem dados de segundos bissextos
Existem alternativas como
temporal-tai, mas isso é inconveniente porque é preciso manter o arquivo de segundos bissextos no clientePor causa da SOP (política CORS), também não dá para buscar o arquivo diretamente de um site externo
Os navegadores são atualizados periodicamente, então fica a dúvida de por que não embutem essas informações
Se o servidor definir o cabeçalho
Access-Control-Allow-Originou fornecer isso no formato de arquivo JS, funcionaAinda assim, incluir e manter dados de segundos bissextos no próprio navegador pode ser uma tarefa custosa
UTC, por definição, inclui segundos bissextos, então o mais correto é dizer que na prática isso lida apenas com tempo POSIX
No exemplo de código, deveria dizer que a interpretação como anos da década de 1900 começa em
"50", e não em"33"— é só uma correção de typoEstou usando o polyfill do Temporal e, até agora, estou bastante satisfeito
Para servidores ou apps grandes, tudo bem, mas em apps pequenos isso pode pesar
Estranhamente, o texto não menciona
Date.now()em momento nenhumPara comparar com Temporal, deveria ter explicado a partir de
Date.now()Essa função retorna o tempo decorrido em milissegundos desde 1º de janeiro de 1970
Temporal tem uma API mais amigável, mas no fundo a proposta é expressar a distância relativa no tempo
Então fica a dúvida de como converter para o formato desejado sem passar por
DateFoi deixada uma correção pequena, mas importante: o certo é “daylight saving time”, e não “daylight savings time”
Até agora eu não sabia que o JS Date era tão bagunçado assim
Se tivessem tido um pouco mais de cuidado naquela época, muitos desenvolvedores não teriam caído nessas armadilhas