Skip to content
industry insights

A classe Date do JavaScript está quebrada

Seu código provavelmente está escondendo bugs sutis relacionados a datas que testes unitários não detectarão. O motivo é uma falha de design fundamental no objeto global mais comum, e mais amaldiçoado, do JavaScript.

Cassidy Wolfe
A classe Date do JavaScript está quebrada

O Paradoxo do "Zero": Uma Primeira Impressão Quebrada

A classe Date do JavaScript está fundamentalmente quebrada, uma relíquia que gera mais frustração do que utilidade. Um teste rápido do vídeo da Better Stack "How well do you know JavaScript's Date class?" expõe imediatamente essa falha sistêmica. Pergunte new Date('0') e você obtém o ano 2000. No entanto, new Date(0) retorna corretamente o Unix epoch, 1 de janeiro de 1970, 00:00:00 UTC. A distinção entre uma string e um número aqui dita uma diferença de trinta anos, uma primeira impressão verdadeiramente desconcertante.

A confusão só aumenta com Date.parse(). Este método opera exclusivamente em strings, o que significa que Date.parse(0) primeiro converte o número 0 na string '0'. Consequentemente, tanto Date.parse('0') quanto Date.parse(0) resultam no ano 2000. A lógica subjacente, se houver, permanece obscura, forçando os desenvolvedores a uma vigilância constante contra coerções inesperadas.

O absurdo vai além do zero. Considere new Date('2'). Alguém poderia esperar um erro ou talvez o epoch, mas o JavaScript interpreta isso como fevereiro de 2001. Tal análise arbitrária decorre do que só pode ser descrito como heurísticas específicas de implementação, onde strings de um único dígito tornam-se ambiguamente anos ou meses. Essa imprevisibilidade torna o objeto Date um campo minado, não uma ferramenta.

Um Campo Minado de Mutabilidade e Fusos Horários

Além das peculiaridades de análise, o objeto Date do JavaScript abriga falhas de design fundamentais que o tornam uma fonte constante de frustração. Sua mutabilidade é uma das principais culpadas. Métodos como setDate() ou setMonth() alteram diretamente a instância de Date, levando a efeitos colaterais insidiosos em toda a aplicação. Passe um objeto Date para uma função, modifique-o e, de repente, a referência original mudou sem aviso explícito, criando pesadelos de depuração.

Depois, há os notórios problemas de fuso horário. O objeto Date converte agressivamente de e para o fuso horário local do usuário, causando erros persistentes de off-by-one-day. Uma data criada a partir de uma string UTC pode parecer correta, mas chamadas subsequentes para getDate() ou getMonth() podem retornar um dia ou mês totalmente diferente se o deslocamento local a deslocar além da meia-noite. Essa ambiguidade entre o horário local e o UTC é uma armadilha constante.

Finalmente, a própria API é uma aula de design ruim. Os meses são indexados em zero, o que significa que janeiro é 0 e dezembro é 11 — uma fonte clássica de bugs que exige cálculo mental constante. Pior ainda, o objeto Date lida com valores inválidos com 'overflow' silencioso, não com erros. Tente new Date(2023, 0, 32): em vez de lançar uma exceção para 32 de janeiro, ele avança para 1º de fevereiro de 2023, mascarando dados ruins e permitindo que datas incorretas se propaguem silenciosamente.

Temporal: A Solução Moderna que Merecemos

O reinado de erros do objeto Date está finalmente terminando. Após décadas de desenvolvedores lutando contra seu comportamento errático, o substituto oficial e moderno do JavaScript, Temporal, está aqui para corrigir a dor. Isso não é apenas uma atualização; é uma mudança de paradigma fundamental, meticulosamente projetada para resolver as falhas de design centrais que atormentam o JavaScript desde a sua criação.

A vantagem mais crucial do Temporal é a sua adoção de objetos imutáveis. Este design evita os efeitos colaterais silenciosos e difíceis de depurar, comuns no objeto mutável Date, garantindo que as operações sempre retornem novas instâncias em vez de alterar as existentes. Além disso, os desenvolvedores finalmente ganham controle explícito e inequívoco sobre o tratamento de fusos horários. Isso elimina as suposições e conversões inesperadas que há muito atormentam aplicações que buscam precisão global.

Além da imutabilidade, o Temporal introduz um conjunto poderoso de tipos de objetos precisos, cada um projetado para modelar com precisão conceitos de tempo específicos. Os desenvolvedores não precisam mais forçar todos os cenários de data e hora em um único objeto Date sobrecarregado. O Temporal oferece tipos dedicados como:

  • Temporal.PlainDate para datas sem contexto de hora ou fuso horário.
  • Temporal.PlainTime para horas sem contexto de data ou fuso horário.
  • Temporal.ZonedDateTime para um momento específico no tempo, vinculado a um fuso horário e calendário.

Esses objetos especializados oferecem clareza e controle inigualáveis, um contraste marcante com as dificuldades inerentes ao objeto Date legado. Para uma exploração mais aprofundada das notórias inconsistências do objeto Date, consulte Date - JavaScript | MDN.

Gostando do artigo? Receba um assim na sua caixa de entrada toda manhã.

um e-mail por dia · cancele em dois cliques · sem rastreadores de terceiros

Como escapar da armadilha do Date hoje

Desenvolvedores, o tempo para desculpas acabou. Embora o Temporal permaneça como uma proposta de Estágio 3, polyfills estáveis como tc39/proposal-temporal tornam-no totalmente pronto para produção hoje. Você não precisa mais adiar o tratamento robusto de datas, esperando pela ubiquidade nativa nos navegadores. Adote o futuro do gerenciamento de data e hora em JavaScript agora para construir aplicações significativamente mais confiáveis.

Considere a armadilha comum e frustrante de adicionar um mês a uma data. O objeto Date nativo do JavaScript, com sua mutabilidade inerente e peculiaridades de calendário frequentemente desconcertantes, muitas vezes produz resultados surpreendentes e incorretos. Por exemplo, tentar adicionar um mês a 31 de janeiro de 2023, usando new Date(2023, 0, 31).setMonth(1), muta desastrosamente o objeto de data para 2 de março de 2023, em vez do esperado 28 ou 29 de fevereiro. O Temporal, por outro lado, oferece clareza e previsibilidade:

// Antes: Date com bugs
const d = new Date(2023, 0, 31);
d.setMonth(d.getMonth() + 1); // Muta para 2 de março de 2023

// Depois: Temporal limpo
const plainDate = Temporal.PlainDate.from('2023-01-31');
const nextMonth = plainDate.add({ months: 1 }); // Corretamente 28 de fevereiro de 2023

Essa diferença marcante destaca o design imutável e a aritmética previsível do Temporal. A API lida consistentemente com transbordamentos de calendário e fusos horários sem armadilhas ocultas. É hora de eliminar a dependência de bibliotecas de terceiros, muitas vezes excessivas, que apenas corrigem deficiências nativas, aumentando o tamanho do bundle e a complexidade desnecessariamente. Comece a aprender este padrão oficial e futuro. Escreva lógica de data que seja verdadeiramente legível, comprovadamente menos propensa a erros e feita para durar, libertando sua base de código de uma década de dores de cabeça relacionadas a datas.

Perguntas Frequentes

Por que new Date('0') retorna o ano 2000 em JavaScript?

Isso se deve a regras de análise inconsistentes e específicas da implementação no motor do JavaScript. Strings curtas e ambíguas não são tratadas de acordo com um padrão claro, levando a resultados inesperados, como '0' sendo interpretado como o ano 2000.

O que é a API Temporal?

Temporal é uma API JavaScript moderna e integrada, projetada para substituir completamente o objeto Date falho. Ela oferece objetos imutáveis, tratamento explícito de fuso horário e um conjunto previsível e robusto de ferramentas para manipulação de data e hora.

A API Temporal está pronta para uso em produção?

Como uma proposta TC39 Stage 3, a Temporal API é estável, mas ainda não está disponível nativamente em todos os navegadores. Os desenvolvedores podem usá-la hoje por meio de polyfills oficiais, permitindo escrever código preparado para o futuro e aproveitar imediatamente suas vantagens.

Por que a Temporal é melhor do que bibliotecas como Day.js ou date-fns?

Embora bibliotecas como Day.js ofereçam excelentes soluções alternativas, elas aumentam o tamanho do bundle da sua aplicação. A Temporal será uma solução nativa e padronizada, integrada diretamente à linguagem JavaScript, oferecendo melhor desempenho e eliminando a necessidade de dependências de terceiros.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only