Trabalho com datas e horas em JavaScript (Node.js): do básico às técnicas avançadas
Trabalhar com datas e horas é uma das tarefas mais comuns no desenvolvimento backend. Seja para registro de eventos, cálculo de prazos, geração de relatórios ou integração com APIs, saber lidar corretamente com timestamps é uma habilidade crítica. Neste artigo, abordaremos todos os aspectos essenciais do trabalho com datas no ambiente Node.js: desde o objeto nativo Date até bibliotecas populares que facilitam a vida do desenvolvedor.
1. O objeto nativo Date: fundamentos e armadilhas
Em JavaScript, o objeto nativo Date é responsável pelo trabalho com datas. Ele fornece métodos básicos para criar, ler e manipular datas. No entanto, possui algumas peculiaridades importantes que você precisa conhecer.
Criação de um objeto Date
A maneira mais simples de obter a data e hora atuais:
const now = new Date();console.log(now); // 2025-03-20T14:30:00.000Z (exemplo)Você pode criar uma data a partir de uma string, timestamp (milissegundos desde 1º de janeiro de 1970) ou definindo os componentes manualmente:
// A partir de uma string (ISO 8601)const dateFromString = new Date("2025-12-25T10:00:00Z");
// A partir de um timestampconst dateFromTimestamp = new Date(1735048800000);
// A partir de componentes (ano, mês (0-11), dia, hora, minuto, segundo, milissegundo)const dateFromParts = new Date(2025, 11, 25, 10, 0, 0, 0); // 25 de dezembro de 2025 10:00:00console.log(dateFromParts); // 2025-12-25T07:00:00.000Z (depende do fuso horário)Importante: Os meses em JavaScript são numerados a partir de 0 (janeiro é 0, dezembro é 11). Esta é uma causa frequente de erros.
Obtendo componentes da data
O objeto Date fornece métodos para obter componentes individuais:
const date = new Date();console.log(date.getFullYear()); // 2025console.log(date.getMonth()); // 2 (março, pois a contagem começa em 0)console.log(date.getDate()); // 20console.log(date.getDay()); // 4 (quinta-feira, 0 - domingo)console.log(date.getHours()); // 17console.log(date.getMinutes()); // 45console.log(date.getSeconds()); // 12console.log(date.getMilliseconds());// 345console.log(date.getTime()); // 1742474712345 (timestamp)Observe: todos esses métodos retornam valores no fuso horário local do servidor. Para trabalhar com UTC, use os métodos com o prefixo getUTC... (por exemplo, getUTCFullYear()).
Manipulação de datas
A alteração de datas é feita através dos métodos set. Eles modificam o objeto original:
const date = new Date();date.setFullYear(2026);date.setMonth(0); // janeirodate.setDate(15);console.log(date); // 2026-01-15T... (os demais componentes são preservados)Armadilha: Os métodos set ajustam a data automaticamente. Por exemplo, se você definir 32 de janeiro, a data se tornará 1º de fevereiro. Isso pode ser tanto conveniente quanto inesperado.
2. Formatação de datas e exibição no formato desejado
O método nativo toLocaleDateString() permite exibir a data no formato adotado por uma localidade específica:
const date = new Date(2025, 11, 25);console.log(date.toLocaleDateString('ru-RU')); // 25.12.2025console.log(date.toLocaleDateString('en-US')); // 12/25/2025console.log(date.toLocaleDateString('de-DE')); // 25.12.2025Para formatação mais flexível, você pode usar Intl.DateTimeFormat:
const formatter = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});console.log(formatter.format(new Date())); // "quinta-feira, 20 de março de 2025, 17:45"No entanto, para formatos complexos (por exemplo, "2025-03-20T14:30:00+03:00") ou modelos personalizados, é melhor usar bibliotecas (sobre as quais falaremos a seguir).