Introducción: Por qué trabajar con fechas en JavaScript es un desafío para el desarrollador
Trabajar con fechas y horas es una de las tareas más comunes y, al mismo tiempo, más engañosas en el desarrollo web. Parece que podría ser más sencillo que obtener la fecha actual o calcular la diferencia entre dos eventos. Sin embargo, en la práctica, los desarrolladores de JavaScript (Node.js) se enfrentan a múltiples trampas: zonas horarias, formato ISO, el comportamiento poco intuitivo del método getMonth() y librerías obsoletas. En este artículo, analizaremos el trabajo con fechas desde los principios básicos hasta técnicas avanzadas, utilizando solo el objeto estándar Date y la librería moderna date-fns.
1. Fundamentos del objeto Date en Node.js
El objeto incorporado Date es la base para trabajar con el tiempo. Almacena la cantidad de milisegundos transcurridos desde el 1 de enero de 1970 (época Unix). Veamos las operaciones principales.
Creación y obtención de la hora actual
La forma más sencilla de crear un objeto de fecha es llamar a new Date() sin argumentos. Esto devuelve la fecha y hora actuales en el servidor.
// Fecha y hora actuales (en la zona horaria del servidor)const now = new Date();console.log(now); // Ejemplo: 2024-05-20T14:30:00.000Z
// Creación a partir de una cadena ISOconst specificDate = new Date('2024-12-25T10:00:00');console.log(specificDate); // 2024-12-25T10:00:00.000Z
// Creación a partir de componentes (año, mes, día, horas, minutos, segundos)const birthday = new Date(1990, 5, 15); // Atención: ¡mes 5 = Junio!console.log(birthday); // 1990-06-15T00:00:00.000ZNota importante: Los meses en JavaScript se numeran desde 0 (Enero — 0, Diciembre — 11). Esta es una causa frecuente de errores.
Métodos para obtener componentes de la fecha
Para extraer partes individuales de la fecha se utilizan los getters. Recuerde que devuelven valores en la zona horaria local del servidor.
const date = new Date('2024-03-15T12:30:45');
console.log(date.getFullYear()); // 2024console.log(date.getMonth()); // 2 (Marzo, ya que el conteo comienza en 0)console.log(date.getDate()); // 15console.log(date.getDay()); // 5 (Viernes, 0 - Domingo)console.log(date.getHours()); // 12console.log(date.getMinutes()); // 30console.log(date.getSeconds()); // 45Para trabajar en UTC (Tiempo Universal Coordinado), use los métodos con el prefijo getUTC..., por ejemplo getUTCHours().
2. Formato y salida de fechas
En Node.js no hay un formato de fecha conveniente incorporado para convertir a un formato de cadena arbitrario (por ejemplo, "15 de marzo de 2024"). Para ello, hay dos caminos: la construcción manual de la cadena o el uso de librerías.
Formato manual (sin librerías externas)
Si necesita mostrar una fecha en un formato simple, puede escribir una pequeña función.
function formatDate(date) { const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); const year = date.getFullYear(); return `${day}.${month}.${year}`;}
const today = new Date();console.log(formatDate(today)); // Ejemplo: "20.05.2024"Solución moderna: la librería date-fns
La librería date-fns es una alternativa moderna, modular y ligera al obsoleto moment.js. Es ideal para Node.js.
// Instalación: npm install date-fns
const { format, addDays, differenceInDays } = require('date-fns');const { es } = require('date-fns/locale'); // Localización
const date = new Date();
// Formato con localizaciónconsole.log(format(date, "dd 'de' MMMM 'de' yyyy", { locale: es }));// Ejemplo: "20 de mayo de 2024"
// Adición de díasconst nextWeek = addDays(date, 7);console.log(format(nextWeek, 'yyyy-MM-dd')); // "2024-05-27"
// Diferencia en díasconst start = new Date(2024, 0, 1);const end = new Date(2024, 11, 31);co