Trabalhando com datas em JavaScript (Node.js): visão geral das bibliotecas populares
Trabalhar com datas e horas é uma das tarefas comuns no desenvolvimento web. O objeto nativo Date em JavaScript possui funcionalidade limitada e uma API inconveniente. Felizmente, para Node.js existem muitas bibliotecas que simplificam o parsing, formatação, manipulação e comparação de datas. Neste artigo, veremos quatro das bibliotecas mais populares: Moment.js, Day.js, date-fns e Luxon.
1. Moment.js (lendária, mas obsoleta)
Moment.js foi por muito tempo o padrão de facto para trabalhar com datas. Ela fornece uma API rica para parsing, validação, manipulação e formatação. No entanto, o projeto é oficialmente considerado obsoleto (legacy) — os desenvolvedores recomendam o uso de alternativas modernas. Principais desvantagens: tamanho grande (~300 KB), métodos mutáveis (alteram o objeto original) e problemas com Tree Shaking.
// Instalação: npm install momentconst moment = require('moment');
// Parsing e formataçãoconst now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2024-01-15 14:30:00
// Manipulaçõesconst future = moment().add(7, 'days').startOf('week');console.log(future.format('dddd, MMMM Do YYYY')); // Monday, January 22nd 2024
// Diferença entre datasconst a = moment('2024-01-01');const b = moment('2024-01-10');console.log(b.diff(a, 'days')); // 92. Day.js (sucessor leve)
Day.js é uma biblioteca moderna com a mesma API do Moment.js, mas com apenas 2 KB de tamanho. Ela é completamente imutável (não altera objetos originais), suporta plugins e funciona perfeitamente com Tree Shaking. Ideal para projetos onde o tamanho do bundle é importante.
// Instalação: npm install dayjsconst dayjs = require('dayjs');const relativeTime = require('dayjs/plugin/relativeTime');dayjs.extend(relativeTime);
const now = dayjs();console.log(now.format('DD.MM.YYYY')); // 15.01.2024
// Trabalhando com fusos horários (requer plugin utc)const utc = require('dayjs/plugin/utc');dayjs.extend(utc);const date = dayjs.utc('2024-01-15T12:00:00Z').local();console.log(date.format('HH:mm')); // 15:00 (depende do fuso horário)
// Tempo relativoconsole.log(dayjs('2023-12-25').fromNow()); // 3 weeks ago3. date-fns (abordagem funcional)
date-fns é uma biblioteca construída com princípios de programação funcional. Em vez de um único objeto, ela fornece muitas funções puras. Cada função é importada separadamente, permitindo incluir apenas o código necessário. É a biblioteca mais performática e modular entre as listadas.
// Instalação: npm install date-fnsconst { format, addDays, differenceInDays, startOfWeek } = require('date-fns');const { ptBR } = require('date-fns/locale');
const now = new Date();
// Formatação com localizaçãoconsole.log(format(now, 'PPPP', { locale: ptBR })); // segunda-feira, 15 de janeiro de 2024
// Manipulações (funções puras)const nextWeek = addDays(now, 7);console.log(format(nextWeek, 'yyyy-MM-dd')); // 2024-01-22
// Diferençaconst start = new Date(2024, 0, 1);console.log(differenceInDays(now, start)); // 14
// Início da semanaconst monday = startOfWeek(now, { weekStartsOn: 1 });console.log(format(monday, 'dd.MM.yyyy')); // 15.01.20244. Luxon (padrão moderno dos criadores do Moment.js)
Luxon é uma biblioteca dos mesmos desenvolvedores do Moment.js, mas sem suas desvantagens. Ela usa objetos nativos DateTime, Duration e Interval, é completamente imutável, suporta fusos horários e internacionalização "prontos para uso". Recomendada para novos projetos.
// Instalação: npm install luxonconst { DateTime, Duration, Inte Também na biblioteca
Prisma para JavaScript (Node.js): guia completo com exemplos
Event Bus e padrão Observer em Kotlin: guia com exemplos
TypeStack/routing-controllers para TypeScript: guia completo com exemplos
Parsing de HTML em Node.js: Principais bibliotecas e exemplos de código