- Aponta a incompletude e inconsistência do objeto
Date existente no JavaScript e apresenta a API Temporal como substituta
Date funciona 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ário
Temporal oferece um novo modelo de tratamento de data e hora baseado em imutabilidade, incluindo classes detalhadas como PlainDate, ZonedDateTime e Duration
- Os métodos de
Temporal não modificam o objeto existente e retornam um novo objeto, permitindo operações de encadeamento mais claras e seguras
Temporal está 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
Date causa 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
Date foi 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() ou setDate(), o objeto original é alterado diretamente
- Isso causa mudanças de valor inesperadas entre variáveis que referenciam o mesmo objeto
- Exemplo: se uma função recebe
today como argumento e modifica a data internamente, o today original também é alterado
Temporal: a nova API de data e hora
Temporal é um objeto de namespace (namespace object), não um construtor, com uma estrutura semelhante à de Math
- Principais componentes:
PlainDate, PlainDateTime, PlainTime, ZonedDateTime, Duration, Now etc.
Temporal.Now retorna o momento atual em vários formatos
plainDateISO() → data no formato ISO
zonedDateTimeISO() → data e hora com fuso horário
- Os objetos de
Temporal oferecem 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
Como Temporal funciona e suas vantagens
- Os objetos de
Temporal continuam sendo objetos, mas seguem um padrão de uso imutável intencional
- Exemplo:
today.add({ days: 1 }) retorna um novo objeto de data, e o today original não é alterado
- Oferece uma sintaxe mais concisa e clara em comparação com
Date
- 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, since e until, é possível expressar cálculos complexos de data de forma concisa
Situação da padronização e perspectivas
Temporal chegou 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
Date continuará 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