Trabajo con fechas y horas en JavaScript: métodos avanzados y bibliotecas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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: Date solo 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 false


Escenarios 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

Blogs

Book Recommendations