> Manuales > Taller de Javascript

Cómo comparar fechas en Javascript, saber si una fecha dada es mayor, menor o igual que otra.

En el día de hoy vamos a realizar un sencillo taller de comparación de fechas en Javascript, una operación bastante habitual en el desarrollo de cualquier aplicación web. Queremos saber si una fecha es igual que otra, o mayor o menor. Puede parecer un tema trivial, pero si lo quieres hacer bien necesitas tener en cuenta varias cosas sencillas.

Primero debemos recordar que para trabajar con fechas en Javascript usamos objetos de la clase Date. Esta clase tiene todo lo que necesitas para comparar dos fechas, aunque dependiendo del tipo de comparación que quieras realizar usarás mecanismos distintos.

Notas rápidas sobre la clase Date

Creamos objetos fecha a partir del constructor de la clase Date, que puede recibir varios juegos de parámetros. Por ejemplo, podremos crear una fecha, con el valor del instante actual, con este código:

var fecha = new Date();

Pero podremos crear fechas en cualquier lugar del tiempo con el paso de distintos parámetros al constructor, todos opcionales:

Año
Mes (comenzando por cero para enero)
Dia
Hora
Minutos
Segundos
Milisegundos

Por ejemplo, estas dos fechas corresponden al 31 de diciembre de 2015. Aunque la segunda fecha además estamos indicando el parámetro "hora con el valor 2, que equivale a las 2 de la madrugada (2 AM).

var f1 = new Date(2015, 11, 31); //31 de diciembre de 2015
var f2 = new Date(2015, 11, 31, 2);

Damos por hecho que sabes algo de las fechas en Javascript, así que nos centraremos en nuestro objetivo que es compararlas. Para mayores referencias puedes leer el artículo sobre la clase Date de Javascript.

Operadores para comparación sobre Date

Los operadores de comparación habituales sirven sobre objetos date, excepto el operador == para comparar igualdad que no te servirá para saber si dos fechas son iguales (luego te explicamos por qué).

>
<
>=
<=

Todos esos te ofrecen resultados perfectos y los podrás usar siempre que los necesites, por ejemplo:

var f1 = new Date(2015, 11, 31); //31 de diciembre de 2015
var f2 = new Date(2014, 10, 30); //30 de noviembre de 2014
    
if(f1 > f2){
    console.log("f1 > f2");
}
if(f1 < f2){
    console.log("f1 < f2");
}

Aquí la consola de Javascript nos dirá que "f1 > f2".

Sin embargo, el operador == no te arrojará el resultado correcto, porque en realidad estará comprobando si los objetos son el mismo.

var f1 = new Date(2015, 11, 31); 
var f2 = new Date(2015, 11, 31);

if (f1 == f2){
    // da igual que f1 y f2 tengan la misma fecha,
    // solo pasaría esa comparación si fueran una referencia al mismo objeto Date. 
    // Es decir, no importa el valor de la fecha que haya en los objetos
}

Comprobar si una fecha es igual a otra

La comparación de igualdad de fechas en Javascript la realizamos de varias maneras. Una de ellas sería convirtiendo la fecha en el número de milisegundos desde 1 de enero de 1970.

Ese número se obtiene con el método getTime(). Como es un número lo podremos comparar con el operador ==.

if (f1.getTime() == f2.getTime()){
    console.log("Son la misma fecha");
}

Nota: getTime() te devuelve algo parecido a lo que se conoce como timestamp, aunque con precisión de milisegundos, mientras que otros lenguajes tienen precisión solo de segundos. A este valor se le llama también "universal time". Además de getTime(), un método equivalente sobre elementos de la clase Date es valueOf(), que devolverá el mismo valor.

El único problema de usar la comparación directa con los valores devueltos por getTime() es que quieras fijarte solamente en las fechas, es decir, que sólo te importen los días del calendario, sin pensar en las horas, minutos, etc. En este caso podría ocurrir que, por un cambio de horario, dos fechas que realmente corresponden al mismo día del calendario no tengan el mismo valor de retorno en el método getTime(). Por ejemplo, estas fechas son del mismo día, pero no del mismo horario exacto.

var f1 = new Date(2015, 11, 31); 
var f2 = new Date(2015, 11, 31, 2);

Son el mismo día, pero la segunda fecha es a las 2 de la mañana y la primera, al no especificar nada, es a las 00:00. Si obtienes el valor de getTime() de ambos objetos Date comprobarás que los valores son diferentes.

Así que, si quieres únicamente comparar las fechas sin importar el horario, entonces como medida de precaución debes anular antes los horarios de las fechas a través del método setHours():

f1.setHours(0,0,0,0);
f2.setHours(0,0,0,0);

El método setHours() recibe como parámetro las horas, minutos, segundos y milisegundos que quieras setear a un objeto de clase Date. Enviándo como parámetros valores iguales a cero para todos los elementos, estaremos eliminando la componente del horario de una fecha. Después de este sencillo cambio, siempre que sea el mismo día del calendario getTime() te devolverá el mismo valor. A continuación ves el código de un ejemplo completo que ilustraría esta práctica.

var f1 = new Date(2015, 11, 31); //31 de diciembre de 2015
var f2 = new Date(2015, 11, 31, 2);
f1.setHours(0,0,0,0);
f2.setHours(0,0,0,0);
if (f1.getTime() == f2.getTime()){
    console.log("Son la misma fecha");
}

Si ejecutas ese código la consola de Javascript te informará que son la misma fecha.

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual