Búsqueda de sitios web

Comparar dos fechas con JavaScript


¿Puede alguien sugerir una forma de comparar los valores de dos fechas para determinar si son mayores, menores y no están en el pasado usando JavaScript? Los valores provendrán de cuadros de texto.

Respuesta #1

El objeto Date hará lo que deseas: construye uno para cada fecha y luego compáralos usando >, <, <= o >=.

Los operadores ==, !=, === y !== requieren que uses date.getTime() como en

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

para ser claro, simplemente verificar la igualdad directamente con los objetos de fecha no funcionará

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

Sin embargo, te sugiero que uses menús desplegables o algún formulario de entrada de fechas similarmente restringido en lugar de cuadros de texto, no sea que te encuentres en el infierno de la validación de entradas.


Para los curiosos, documentación de date.getTime():

Devuelve el valor numérico de la fecha especificada como el número de milisegundos desde el 1 de enero de 1970, 00:00:00 UTC. (Se devuelven valores negativos para tiempos anteriores.)

Respuesta #2

Compara < y > como de costumbre, pero cualquier cosa que involucre == o === debe usar un prefijo +. Así:

const x = new Date('2013-05-23');
const y = new Date('2013-05-23');

// less than, greater than is fine:
console.log('x < y', x < y); // false
console.log('x > y', x > y); // false
console.log('x <= y', x <= y); // true
console.log('x >= y', x >= y); // true
console.log('x === y', x === y); // false, oops!

// anything involving '==' or '===' should use the '+' prefix
// it will then compare the dates' millisecond values

console.log('+x === +y', +x === +y); // true

Respuesta #3

La forma más fácil de comparar fechas en JavaScript es primero convertirlas en un objeto Date y luego comparar estos objetos de fecha.

A continuación encontrarás un objeto con tres funciones:

  • dates.compare(a,b)

    Devuelve un número:

    • -1 si a < b
    • 0 si a=b
    • 1 si a > b
    • NaN si a o b es una fecha no válida
  • dates.enRango (d,inicio,fin)

    Devuelve un valor booleano o NaN:

    • verdadero si d está entre el inicio y el fin (inclusive)
    • falso si d está antes de start o después de end.
    • NaN si una o más de las fechas son ilegales.
  • fechas.convertir

    Utilizado por las otras funciones para convertir su entrada en un objeto de fecha. La entrada puede ser

    • un objeto fecha : La entrada se devuelve tal cual.
    • un arreglo: Interpretado como [año, mes, día]. NOTA el mes es 0-11.
    • un número : Interpretado como el número de milisegundos desde el 1 de enero de 1970 (un sello de tiempo)
    • una cadena : Se soportan varios formatos diferentes, como "YYYY/MM/DD", "MM/DD/YYYY", "31 de enero de 2009", etc.
    • un objeto: Interpretado como un objeto con atributos de año, mes y día. NOTA el mes va de 0 a 11.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}

Respuesta #4

Los operadores relacionales < <= > >= se pueden usar para comparar fechas en JavaScript:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

Sin embargo, los operadores de igualdad == != === !== no se pueden usar para comparar las fechas porque:

  1. Si los operandos tienen el mismo tipo, se comparan de la siguiente manera:

    • Objeto: devuelve true solo si ambos operandos hacen referencia al mismo objeto.

Puedes comparar el valor de las fechas para igualdad usando cualquiera de estos métodos:

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

Tanto Date.getTime() como Date.valueOf() devuelven el número de milisegundos desde el 1 de enero de 1970, 00:00 UTC. Tanto la función Number como el operador unario + llaman a los métodos valueOf() detrás de escena.

Respuesta #5

Con diferencia, el método más fácil es restar una fecha de la otra y comparar el resultado.

var oDateOne = new Date();
var oDateTwo = new Date();

console.log(oDateOne - oDateTwo === 0);
console.log(oDateOne - oDateTwo < 0);
console.log(oDateOne - oDateTwo > 0);

Respuesta #6

Comparar fechas en JavaScript es bastante fácil... JavaScript tiene un sistema de comparación integrado para fechas que hace que sea muy fácil realizar la comparación...

Solo sigue estos pasos para comparar el valor de 2 fechas, por ejemplo, tienes 2 entradas que cada una tiene un valor de fecha en String y quieres compararlas...

1. tienes 2 valores de cadena que obtienes de una entrada y te gustaría compararlos, son los siguientes:

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2. Necesitan ser Objeto Fecha para ser comparados como valores de fecha, así que simplemente conviértelos a fecha, usando new Date(), yo solo los reasigno por simplicidad en la explicación, pero puedes hacerlo de la manera que prefieras:

date1 = new Date(date1);
date2 = new Date(date2);

3. Ahora simplemente compáralos, usando el > < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

Respuesta #7

Comparar solo el día (ignorando el componente de tiempo):

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

Uso :

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

Ya no recomiendo modificar el prototype de los objetos incorporados. Intenta esto en su lugar:

function isSameDay(d1, d2) {
  return d1.getFullYear() === d2.getFullYear() &&
    d1.getDate() === d2.getDate() &&
    d1.getMonth() === d2.getMonth();
}


console.log(isSameDay(new Date('Jan 15 2021 02:39:53 GMT-0800'), new Date('Jan 15 2021 23:39:53 GMT-0800')));
console.log(isSameDay(new Date('Jan 15 2021 10:39:53 GMT-0800'), new Date('Jan 16 2021 10:39:53 GMT-0800')));

N.B. el año/mes/día se devolverá para tu zona horaria; recomiendo usar una biblioteca que reconozca la zona horaria si quieres comprobar si dos fechas están en el mismo día en una zona horaria diferente.

p. ej.

> (new Date('Jan 15 2021 01:39:53 Z')).getDate()  // Jan 15 in UTC
14  // Returns "14" because I'm in GMT-08

Respuesta #8

¿Qué formato?

Si construyes un objeto Date de Javascript, puedes simplemente restarlos para obtener la diferencia en milisegundos (edición: o simplemente compararlos) :

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true

Respuesta #9

Nota - Comparar solo la parte de la fecha:

Cuando comparamos dos fechas en JavaScript, también se toman en cuenta las horas, minutos y segundos. Así que si solo necesitamos comparar la fecha, este es el enfoque:

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

Ahora: if date1.valueOf()> date2.valueOf() funcionará de maravilla.

Respuesta #10

La manera simple es,

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

Respuesta #11

RESPUESTA CORTA

Aquí hay una función que devuelve {boolean} si la fecha y hora de inicio es mayor que la fecha y hora de fin. Demostración en acción

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

Explicación

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

ya que ahora tienes ambos datetime en tipo numérico, puedes compararlos con cualquier operación de comparación

( >, < ,= ,!= ,== ,!== ,>= Y <=)

Entonces

si estás familiarizado con C# Cadena de Formato Personalizado de Fecha y Hora, esta biblioteca debería hacer exactamente lo mismo y ayudarte a formatear tu fecha y hora dtmFRM, ya sea que estés pasando una cadena de fecha y hora o formato unix

Uso

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

DEMOSTRACIÓN

todo lo que tienes que hacer es pasar cualquiera de estos formatos pacificados en el archivo de biblioteca js

Respuesta #12

Puedes usar este código:

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

Y también revisa el artículo de MDN sobre la clase Date.

Respuesta #13

function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

Respuesta #14

var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates

Respuesta #15

Vía Moment.js

Jsfiddle: http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

El método devuelve 1 si dateTimeA es mayor que dateTimeB

El método devuelve 0 si dateTimeA es igual a dateTimeB

El método devuelve -1 si dateTimeA es menor que dateTimeB

Respuesta #16

CUÍDATE DE LA ZONA HORARIA

Una fecha de JavaScript no tiene noción de zona horaria. Es un momento en el tiempo (ticks desde la época) con funciones prácticas para traducir hacia y desde cadenas en la zona horaria “local”. Si quieres trabajar con fechas usando objetos Date, como todos aquí están haciendo, quieres que tus fechas representen la medianoche UTC al inicio de la fecha en cuestión. Esta es una convención común y necesaria que te permite trabajar con fechas sin importar la estación o la zona horaria de su creación. Por lo tanto, necesitas ser muy vigilante para manejar la noción de zona horaria, particularmente cuando creas tu objeto Date de medianoche UTC.

La mayoría de las veces, querrás que tu fecha refleje la zona horaria del usuario. Haz clic si hoy es tu cumpleaños. Los usuarios en NZ y US hacen clic al mismo tiempo y obtienen fechas diferentes. En ese caso, haz esto...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

A veces, la comparabilidad internacional tiene prioridad sobre la precisión local. En ese caso, haz esto...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

Ahora puedes comparar directamente tus objetos de fecha como sugieren las otras respuestas.

Habiendo tenido cuidado de gestionar la zona horaria al crear, también necesitas asegurarte de mantener la zona horaria fuera cuando la conviertas de nuevo a una representación en cadena. Así que puedes usar de manera segura...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

Y evita totalmente todo lo demás, especialmente...

  • getYear(),getMonth(),getDate()

Respuesta #17

Solo para agregar otra posibilidad más a las muchas opciones existentes, podrías intentar:

if (date1.valueOf()==date2.valueOf()) .....

...lo cual parece funcionar para mí. Por supuesto, tienes que asegurarte de que ambas fechas no estén indefinidas...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

De esta manera podemos asegurarnos de que se haga una comparación positiva si ambos también están indefinidos, o...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

...si prefieres que no sean iguales.

Respuesta #18

Si el siguiente es su formato de fecha, puede usar este código:

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

Comprobará si el número 20121121 es mayor que 20121103 o no.

Artículos relacionados