Introducción: ¿Por qué no es suficiente la Date() estándar?
El objeto Date incorporado en JavaScript es una herramienta potente pero no siempre conveniente. Al desarrollar aplicaciones complejas en Node.js (por ejemplo, programadores de tareas, sistemas de análisis o servicios financieros), los desarrolladores se enfrentan a una serie de problemas:
- Mutabilidad: métodos como
setMonth()modifican el objeto original. - Soporte limitado de zonas horarias:
Datesolo funciona con la hora local y UTC. - Complejidad del formateo: no existe un análogo incorporado de
strftime. - Análisis de cadenas:
new Date("2023-13-01")no generará un error, sino que creará "2024-01-01".
En este artículo, analizaremos enfoques avanzados para trabajar con fechas y horas en Node.js que ayudarán a evitar estos problemas y escribir código más confiable.
1. Intl.DateTimeFormat: Formateo sin dependencias externas
JavaScript moderno (ES6+) proporciona una API de internacionalización integrada Intl.DateTimeFormat. Esta es una herramienta potente que permite formatear fechas y horas para cualquier configuración regional sin necesidad de conectar bibliotecas de terceros.
Uso básico
const date = new Date('2024-03-15T14:30:00Z');
// Formateo para la configuración regional rusaconst formatterRU = new Intl.DateTimeFormat('ru-RU', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'});
console.log(formatterRU.format(date));// "пятница, 15 марта 2024 г., 17:30"Opciones avanzadas: Zonas horarias y tiempo relativo
// Formateo con consideración de zona horariaconst formatterTZ = new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York', dateStyle: 'full', timeStyle: 'short'});console.log(formatterTZ.format(date));// "Friday, March 15, 2024 at 10:30 AM"
// Formateo relativo (Intl.RelativeTimeFormat)const rtf = new Intl.RelativeTimeFormat('ru', { numeric: 'auto' });console.log(rtf.format(-5, 'day')); // "5 дней назад"console.log(rtf.format(2, 'month')); // "через 2 месяца"Este enfoque es ideal cuando necesitas evitar dependencias innecesarias pero requieres un formateo flexible para la interfaz de usuario.
2. La biblioteca date-fns: Modularidad y funcionalidad
date-fns es una biblioteca moderna construida sobre los principios de la programación funcional. Su principal ventaja es la modularidad: importas solo las funciones que necesitas, lo que reduce significativamente el tamaño del paquete.
Instalación y ejemplos básicos
// Instalación: npm install date-fnsimport { format, addDays, subMonths, differenceInDays, isWeekend } from 'date-fns';import { ru } from 'date-fns/locale';
const today = new Date();
// Formateo con configuración regionalconsole.log(format(today, 'dd MMMM yyyy, EEEE', { locale: ru }));// "15 марта 2024, пятница"
// Aritmética de fechasconst nextWeek = addDays(today, 7);const lastMonth = subMonths(today, 1);
// Diferencia entre fechasconst diff = differenceInDays(nextWeek, today);console.log(diff); // 7
// Verificación de fin de semanaconsole.log(isWeekend(today)); // true o falseEscenarios complejos: Comparación y validación
import { parse, isValid, isBefore, isAfter, startOfMonth, endOfMonth } from 'date-fns';
// Análisis seguroconst parsed = parse('2024-13-01', 'yyyy-MM-dd', new Date());console.log(isValid(parsed)); // false — fecha no válida
// Trabajo con rangosconst start = startOfMonth(new Date(2024, 2, 1)); // 1 de marzoconst end = endOfMonth(new Date(2024, 2, 1)); // 31 de marzo
const targetDate = new Date(2024, 2, 15);if (isAfter(targetDate, start) && isBefore(targetDate, end)) { console.log('La fecha está en marzo de 2024');}date-fns