Comprobando si dos fechas tienen la misma información de fecha

82

¿Cómo puedo comprobar si dos objetos de fecha diferentes tienen la misma información de fecha (que tienen el mismo día, mes, año ...)? He intentado "==", "===" y .equals pero ninguno parece funcionar.

Hellnar
fuente

Respuestas:

136

Puede usar valueOf()o getTime():

a = new Date(1995,11,17);
b = new Date(1995,11,17);

a.getTime() === b.getTime() // prints true
Felix Kling
fuente
18
Porque en el caso de >=los valores se convierten en números. En el caso de que ==los objetos se comparen entre sí (y solo a == asería cierto).
Felix Kling
8
Solo señalando que esta solución requiere que las fechas solo consistan en las partes de la fecha, mientras que muchas personas que vienen a esta pregunta pueden tener diferentes requisitos ( ejemplo con partes de tiempo en jsFiddle )
KyleMit
1
Entonces, cuando use esto, asegúrese de que las partes de tiempo estén configuradas en 0 gracias a la función setHours :a.setHours(0,0,0,0);
Bobina
Esto no funcionará si hay alguna diferencia de milisegundos. Dado que getTime()devuelve el tiempo en milisegundos, ambos tiempos también pueden tener una diferencia de milisegundos. En esta solución, no funcionará como se esperaba. Intente usartoDateString()
Rehan Sattar
41

Si solo está interesado en verificar si las fechas ocurren el mismo día, independientemente de la hora, puede usar el toDateString() método para comparar. Este método devuelve solo la fecha sin hora:

var start = new Date('2015-01-28T10:00:00Z');
var end = new Date('2015-01-28T18:00:00Z');

if (start.toDateString() === end.toDateString()) {
  // Same day - maybe different times
} else {
  // Different day
}
ciberwombat
fuente
39

Usé este código:

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

Entonces simplemente lo llamas como: if (aDate.isSameDateAs(otherDate)) { ... }

Incidentalmente
fuente
¿Por qué ejecutarías una docena de funciones cuando puedes usar getTime () solo dos veces? Oh, ¿estabas pensando en ignorar las diferencias de hora, mes y año? En ese caso, ¿tal vez las consideraciones de la zona horaria comiencen a importar?
ErikE
12
Porque la pregunta era "dos objetos de fecha diferentes tienen la misma información de fecha", y este código hace precisamente eso: compara fechas independientemente de la hora
Incidentemente
2
er, quise decir "ignorando las diferencias en horas, minutos y segundos"
ErikE
14

Escriba convertir a números enteros:

a = new Date(1995,11,17);
b = new Date(1995,11,17);
+a === +b;  //true
d2vid
fuente
4
uso impresionante del operador
Unario
6

Hellnar,

podría intentar (perdón por el nombre de la función :) - modificado según el valor de Felix, en lugar de getTime)

function isEqual(startDate, endDate) {
    return endDate.valueOf() == startDate.valueOf();
}

uso:

if(isEqual(date1, date2)){
   // do something
}

podría llevarte parte del camino allí.

ver también:

'http://www.java2s.com/Tutorial/JavaScript/0240__Date/DatevalueOf.htm'

jim tollan
fuente
4

Para una mejor compatibilidad con la fecha, use moment.js e isSame método

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-04-06').startOf('day');

console.log(starDate.isSame(endDate)); // false ( month is different )

var starDate = moment('2018-03-06').startOf('day');
var endDate  = moment('2018-03-06').startOf('day');

console.log(starDate.isSame(endDate)); // true ( year, month and day are the same )
que1326
fuente
3

restarlos y compararlos con cero:

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

// haz algo con las fechas ...

(date1 - date2) ? alert("not equal") : alert("equal");

para ponerlo en una variable:

var datesAreSame = !(date1 - date2);
Ege Özcan
fuente
3

Una alternativa simple de una sola línea para determinar si dos fechas son iguales, ignorando la parte de tiempo:

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

Determina si las fechas ayb difieren no más de un día y comparten el mismo día de la semana.

function isSameDate(a, b) {
    return Math.abs(a - b) < (1000 * 3600 * 24) && a.getDay() === b.getDay();
}

console.log(isSameDate(new Date(2017, 7, 21), new Date(2017, 7, 21))); //exact same date => true
console.log(isSameDate(new Date(2017, 7, 21, 23, 59, 59), new Date(2017, 7, 21))); //furthest same dates => true
console.log(isSameDate(new Date(2017, 7, 20, 23, 59, 59), new Date(2017, 7, 21))); //nearest different dates => false
console.log(isSameDate(new Date(2016, 7, 21), new Date(2017, 7, 21))); //different year => false
console.log(isSameDate(new Date(2017, 8, 21), new Date(2017, 7, 21))); //different month => false

Philip Bijker
fuente