Trabalhando com datas em TypeScript: visão geral das bibliotecas populares
Trabalhar com datas e horas é uma das tarefas mais comuns e, ao mesmo tempo, não triviais no desenvolvimento web. O objeto nativo Date em JavaScript (e TypeScript) tem várias desvantagens: mutabilidade, API não intuitiva, problemas com fusos horários e falta de métodos convenientes de formatação. Felizmente, o ecossistema TypeScript oferece várias bibliotecas poderosas que resolvem esses problemas e fornecem excelente suporte a tipos.
Neste artigo, veremos três das bibliotecas mais populares: date-fns, Luxon e Day.js. Você aprenderá sobre suas características, vantagens, desvantagens e verá exemplos de uso com TypeScript.
1. date-fns — modular e funcional
date-fns é uma biblioteca construída com base nos princípios da programação funcional. Cada função é um módulo separado, o que permite importar apenas o necessário e reduz significativamente o tamanho do bundle. No TypeScript, a biblioteca possui tipos integrados.
Instalação
npm install date-fnsExemplos de uso com TypeScript
import { format, addDays, differenceInDays, isAfter, parseISO } from 'date-fns';
// Formatação de dataconst today = new Date();console.log(format(today, 'yyyy-MM-dd')); // '2025-03-20'
// Adicionando diasconst nextWeek = addDays(today, 7);console.log(format(nextWeek, 'dd.MM.yyyy')); // '27.03.2025'
// Diferença entre datasconst startDate = parseISO('2025-01-01');const endDate = parseISO('2025-12-31');const daysBetween = differenceInDays(endDate, startDate);console.log(`Dias em 2025: ${daysBetween}`); // 364
// Comparação de datasconst isFuture = isAfter(parseISO('2025-06-01'), today);console.log(`1 de junho de 2025 está no futuro? ${isFuture}`); // trueVantagens
- Tree-shaking — você importa apenas as funções necessárias, o que reduz o tamanho da aplicação.
- Imutabilidade — as funções não modificam os objetos originais, mas retornam novos.
- Suporte a TypeScript — tipagem completa pronta para uso.
- Localização — suporte a vários idiomas, incluindo português.
Desvantagens
- Trabalha com o
Datenativo, o que pode ser inconveniente para operações complexas com fusos horários. - Não possui suporte interno para objetos imutáveis (como no Luxon).
2. Luxon — poderoso e moderno
Luxon é uma biblioteca de um dos autores do Moment.js, mas sem suas desvantagens. Ela usa seus próprios objetos imutáveis DateTime, Duration e Interval, o que torna o trabalho com datas intuitivo e seguro. O Luxon tem excelente suporte para fusos horários e localidades.
Instalação
npm install luxonPara TypeScript, pode ser necessário instalar os tipos:
npm install --save-dev @types/luxonExemplos de uso com TypeScript
import { DateTime, Duration } from 'luxon';
// Criação e formataçãoconst now = DateTime.now();console.log(now.toFormat('yyyy-MM-dd HH:mm:ss')); // '2025-03-20 14:30:00'
// Trabalhando com fusos horáriosconst moscowTime = DateTime.now().setZone('Europe/Moscow');console.log(`Horário de Moscou: ${moscowTime.toFormat('HH:mm')}`);
// Adicionando intervaloconst nextMonth = now.plus({ months: 1 });console.log(`Daqui a um mês: ${nextMonth.toFormat('dd.MM.yyyy')}`);
// Diferença entre datasconst start = DateTime.fromISO('2025-01-01');const end = DateTime.fromISO('2025-12-31');const diff = end.diff(start, ['months', 'days']);console.log(`Diferença: ${diff.months} meses e ${diff.days} dias`);
// Trabalhando com duraçõesconst duration = Duration.from