Trabajo con fechas y horas en JavaScript (Node.js): desde lo básico hasta técnicas avanzadas
Trabajar con fechas y horas es una de las tareas más comunes en el desarrollo web. Ya sea para registro de eventos, procesamiento de datos de usuario, planificación de tareas o visualización de marcas de tiempo — no se puede prescindir de saber manejar fechas en JavaScript. En este artículo, analizaremos todos los aspectos clave del trabajo con fechas en el entorno Node.js: desde la creación y el formateo hasta manipulaciones complejas con zonas horarias y el uso de bibliotecas populares.
Conceptos básicos: el objeto Date en JavaScript
El objeto incorporado Date es la base para trabajar con fechas. Almacena la cantidad de milisegundos transcurridos desde el 1 de enero de 1970 (Época Unix).
Creación de una fecha
Existen varias formas de crear una instancia de Date:
// Fecha y hora actualconst now = new Date();console.log(now); // 2025-03-15T10:30:00.000Z
// Desde milisegundos (Unix timestamp)const fromTimestamp = new Date(1742025000000);console.log(fromTimestamp); // 2025-03-15T10:30:00.000Z
// Desde una cadena (ISO 8601)const fromString = new Date('2025-03-15T10:30:00');console.log(fromString);
// Desde componentes (año, mes, día, hora, minuto, segundo, milisegundo)const fromComponents = new Date(2025, 2, 15, 10, 30, 0, 0); // Meses: 0-11console.log(fromComponents); // March 15, 2025 10:30:00Importante: los meses en JavaScript se numeran desde 0 (enero es 0, diciembre es 11).
Obtención de componentes de la fecha
Métodos para extraer partes individuales de la fecha:
const date = new Date('2025-03-15T10:30:45.123Z');
console.log(date.getFullYear()); // 2025console.log(date.getMonth()); // 2 (marzo)console.log(date.getDate()); // 15console.log(date.getDay()); // 6 (sábado, 0 - domingo)console.log(date.getHours()); // 10console.log(date.getMinutes()); // 30console.log(date.getSeconds()); // 45console.log(date.getMilliseconds());// 123console.log(date.getTime()); // milisegundos desde la épocaFormateo de fechas en Node.js
El Date estándar proporciona capacidades de formateo limitadas. Para una salida legible, use toLocaleDateString() y toLocaleString().
const date = new Date('2025-03-15T10:30:00');
// Formateo localizadoconsole.log(date.toLocaleDateString('es-ES')); // 15/3/2025console.log(date.toLocaleTimeString('es-ES')); // 10:30:00console.log(date.toLocaleString('es-ES')); // 15/3/2025, 10:30:00
// Con opcionesconst options = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long', hour: '2-digit', minute: '2-digit'};console.log(date.toLocaleString('es-ES', options)); // sábado, 15 de marzo de 2025, 10:30Formateo personalizado
Para un control total, escriba una función simple:
function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') { const map = { YYYY: date.getFullYear(), MM: String(date.getMonth() + 1).padStart(2, '0'), DD: String(date.getDate()).padStart(2, '0'), HH: String(date.getHours()).padStart(2, '0'), mm: String(date.getMinutes()).padStart(2, '0'), ss: String(date.getSeconds()).padStart(2, '0'), }; return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => map[match]);}
console.log(formatDate(new Date(), 'DD.MM.YYYY')); // 15.03.2025console.log(formatDate(new Date(), 'HH:mm:ss')); // 10:30:00Manipulación de fechas: suma, resta, comparación
Las fechas se pueden modificar directamente a través de los métodos set* o trabajando con milisegundos.
Sumar y restar tiempo
const date = new Date('2025-03-15T10:30:00');
// Añadir 5 díasdate.setDate(date.getDate() + 5);console.log(date); // 2025-03-20T10:30:00
// Añadir
```