Trabajo con fechas en JavaScript (Node.js): resumen de bibliotecas populares
Trabajar con fechas y horas es una de las tareas más comunes en el desarrollo web. El objeto incorporado Date en JavaScript (Node.js) proporciona capacidades básicas, pero a menudo resulta incómodo y limitado: falta de formato conveniente, análisis, manipulaciones con zonas horarias y diferencia entre fechas. Afortunadamente, existen varias bibliotecas maduras que resuelven estos problemas. En este artículo, analizaremos las cuatro herramientas más populares para trabajar con fechas en Node.js.
1. Moment.js — un clásico (pero con reservas)
Moment.js fue durante mucho tiempo el estándar de facto para trabajar con fechas en JavaScript. Proporciona una API rica para análisis, validación, formato y manipulaciones de fechas.
Instalación:
npm install momentEjemplo de uso:
const moment = require('moment');
// Fecha y hora actualconst now = moment();console.log(now.format('YYYY-MM-DD HH:mm:ss')); // 2025-03-21 14:30:00
// Análisis de cadenaconst date = moment('2025-12-25', 'YYYY-MM-DD');console.log(date.format('dddd, MMMM Do YYYY')); // Thursday, December 25th 2025
// Manipulacionesconst future = moment().add(7, 'days').subtract(2, 'hours');console.log(future.fromNow()); // "in 6 days"
// Diferencia entre fechasconst a = moment('2025-01-01');const b = moment('2025-03-21');console.log(b.diff(a, 'days')); // 79Ventajas: comunidad enorme, documentación detallada, múltiples complementos (trabajo con zonas horarias, localización).
Desventajas: la biblioteca está obsoleta (modo de soporte), tamaño grande (~230 KB), métodos mutantes (modifican el objeto original). Los desarrolladores recomiendan usar alternativas modernas.
2. date-fns — enfoque modular y funcional
date-fns es una biblioteca moderna construida sobre principios de programación funcional. Cada función es un módulo independiente, lo que permite conectar solo las partes necesarias y reducir el tamaño del bundle.
Instalación:
npm install date-fnsEjemplo de uso:
const { format, addDays, subHours, differenceInDays, parseISO } = require('date-fns');
// Formatoconst now = new Date();console.log(format(now, 'yyyy-MM-dd HH:mm:ss')); // 2025-03-21 14:30:00
// Manipulaciones (inmutable — se crea un nuevo objeto)const future = addDays(now, 7);const adjusted = subHours(future, 2);console.log(format(adjusted, 'dd.MM.yyyy')); // 28.03.2025
// Diferenciaconst start = parseISO('2025-01-01');const end = new Date();console.log(differenceInDays(end, start)); // 79
// Localización (rusa)const { ru } = require('date-fns/locale');console.log(format(now, 'PPPP', { locale: ru })); // "пятница, 21 марта 2025 г."Ventajas: modularidad, inmutabilidad (no modifica los objetos originales), soporte para TypeScript, excelente documentación.
Desventajas: requiere Node.js 14+, no tiene soporte incorporado para zonas horarias (requiere date-fns-tz).
3. Day.js — alternativa ligera y rápida a Moment.js
Day.js es una biblioteca minimalista (solo 2 KB) que tiene una API casi completamente compatible con Moment.js. Es ideal si necesitas reemplazar Moment.js sin reescribir código.
Instalación:
npm install dayjsEjemplo de uso:
const dayjs = require('dayjs');const utc = require('dayjs/plugin/utc');const relativeTime = require('dayjs/plugin/relativeTime');
dayjs.extend(utc);dayjs.extend(relativeTime);
// Uso básico (como en Moment)const now = dayjs();console.log(now