Comparación de fechas en JavaScript: optimización y rendimiento

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

Comparación de fechas en JavaScript: cómo evitar errores y acelerar el código

\n\n

Imagínese: está escribiendo una tienda en línea y necesita verificar si un descuento en un producto ha caducado. O está haciendo un calendario de tareas donde necesita filtrar los eventos de hoy. O está recopilando análisis — "muestra todos los pedidos de la última semana". En todas partes necesita comparar dos fechas. Parecería, ¿qué podría ser más simple? Pero JavaScript, como siempre, está listo para dar sorpresas.

\n\n

La pregunta "Compare two dates with JavaScript" en Stack Overflow ha acumulado miles de visitas — y no es casualidad. Los desarrolladores, incluso los experimentados, a menudo tropiezan con características no obvias al trabajar con fechas. En este artículo no solo mostraremos cómo comparar dos fechas, sino que también analizaremos qué método es más rápido y cuál es más seguro. ¡Vamos allá!

\n\n

¿Por qué no funciona la comparación simple de fechas?

\n\n

Empecemos con el error clásico de un principiante. Supongamos que tenemos dos fechas:

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\n\nconsole.log(date1 < date2);  // true\nconsole.log(date1 > date2);  // false\nconsole.log(date1 == date2); // false\n
\n\n

Con los operadores < y > todo funciona perfectamente. JavaScript convierte los objetos Date en números (milisegundos) y los compara. Pero el operador == (y el estricto ===) se comporta de manera diferente. Compara referencias a objetos, no sus valores. Dos fechas diferentes son dos objetos diferentes, por lo tanto == siempre devolverá false, incluso si las fechas coinciden al milisegundo.

\n\n

Esta es la primera trampa. De aquí la moraleja: nunca use == o === para comparar fechas. Solo <, >, <=, >= o métodos especiales.

\n\n

Método getTime(): el estándar de oro para la comparación de fechas

\n\n

La forma más confiable y eficiente es usar el método getTime(). Devuelve la cantidad de milisegundos transcurridos desde el 1 de enero de 1970 (época Unix). Y JavaScript sabe comparar números perfectamente:

\n\n
let date1 = new Date('2024-03-15T10:00:00');\nlet date2 = new Date('2024-03-15T10:00:00');\nlet date3 = new Date('2024-03-20T10:00:00');\n\nconsole.log(date1.getTime() === date2.getTime()); // true\nconsole.log(date1.getTime() < date3.getTime());   // true\nconsole.log(date1.getTime() > date3.getTime());   // false\n
\n\n

¿Por qué es eficiente? Porque getTime() es una operación muy ligera. Simplemente devuelve el valor numérico ya almacenado dentro del objeto Date. Sin análisis, sin cálculos adicionales. Solo un número.

\n\n

Midamos el rendimiento. Aquí hay una pequeña prueba en la consola del navegador:

\n\n
let date1 = new Date('2024-01-01');\nlet date2 = new Date('2024-12-31');\n\nconsole.time('getTime');\nfor (let i = 0; i < 1000000; i++) {\n    date1.getTime() < date2.getTime();\n}\nconsole.timeEnd('getTime');\n// Resultado: ~5-10 ms en navegadores modernos\n
\n\n

Un millón de comparaciones en 10 milisegundos es un resultado excelente. En comparación, los métodos alternativos pueden ser de 2 a 3 veces más lentos.

\n\n

Comparación de fechas con valueOf()

\n\n

El método valueOf() hace lo mismo que getTime() — devuelve la representación numérica de la fecha. Pero hay un matiz: al usar operadores de comparación (<, >, etc.), JavaScript llama implícitamente a valueOf() para los objetos Date. Es decir, este código:

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\nconsole.log(date1 < date2);\n
\n\n

En realidad funciona como:

\n\n
console.log(date1.valueOf() < date2.valueOf());\n
\n\n

Por lo tanto, para comparaciones simples con < y > se pueden usar directamente los objetos Date. Pero para la igualdad exacta (===) esto no funcionará, y aquí no se puede prescindir de getTime() o va

Blogs

Book Recommendations