2011-09-30 28 views
61

Al comparar objetos de fecha en Javascript, encontré que incluso comparando la misma fecha no devuelve verdadero.JavaScript Fecha Comparación de objetos

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 
var startDate3 = new Date("01/10/2012"); 
alert(startDate1>startDate2); // true 
alert(startDate2==startDate3); //false 

¿Cómo puedo comparar la igualdad de estas fechas? Estoy interesado en utilizar el objeto nativo Date de JS y no en bibliotecas de terceros ya que no es apropiado utilizar un JS de terceros solo para comparar las fechas.

+8

excelente ejemplo de cómo esto está mal diseñado en JavaScript. – devios1

Respuesta

96

Esto se debe a que en el segundo caso, se comparan los objetos de la fecha real y dos objetos nunca son iguales entre sí. Obligarlos a número:

alert(+startDate2 == +startDate3); // true 

Si desea una conversión más explícitamente a número, utilice uno:

alert(startDate2.getTime() == startDate3.getTime()); // true 

o

alert(Number(startDate2) == Number(startDate3)); // true 

Oh, una referencia a la especificación: §11.9 .3 The Abstract Equality Comparison Algorithm que básicamente dice que al comparar objetos, obj1 == obj2 es verdadero solo si se refieren al mismo objeto, de lo contrario el resultado es falso.

+0

Tengo una respuesta más alta, pero ¿hay una forma más correcta de usar _strict equals_ operator '===' en tus ejemplos? –

+5

@AndrewD. el uso de iguales estrictos en este caso particular no hace ninguna diferencia en los resultados, esto se debe a que el operador igual en los ejemplos, siempre trata con operandos del mismo tipo, @RobG está convirtiendo los valores explícitamente a Número (ejemplo 1 y 3) o en el ejemplo 2, sabemos que 'Date.prototype.getTime' siempre devolverá un Número ... – CMS

+0

@RobG: Cuando dice" 'obj1 == obj2' es verdadero solo si se refieren al mismo objeto "¿Eso significa que la comparación (si ambos operandos son objetos) no prueba la igualdad, sino la identidad? ¿Lo entiendo bien? –

16

comparación de fechas utilizando getTime() número de milisegundos desde la época (es decir, un número) que regresan:

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 
var startDate3 = new Date("01/10/2012"); 
alert(startDate1.getTime() > startDate2.getTime()); // true 
alert(startDate2.getTime() == startDate3.getTime()); //true 

también considerar el uso de Date constructor teniendo mes número explícita año// día en lugar de confiar en representación de cadena (ver: Date.parse()) Y recuerde que las fechas en JavaScript siempre se representan utilizando la zona horaria del cliente (navegador).

+1

+1 para el comentario sobre el uso de cadenas como argumento para Date(). – RobG

4

puede comparar los milisegundos reales:

alert(startDate2.getTime() === startDate3.getTime()); 
6

No es necesario utilizar el getTime método- puede restar un objeto de fecha de otro objeto de fecha. Se devolverá la diferencia milisegundos (negativo, si el segundo es una fecha posterior)

var startDate1 = new Date("02/10/2012"); 
var startDate2 = new Date("01/10/2012"); 

var diff= (startDate1 -startDate2) 

// evalúa a 0 si las fechas tienen la misma marca de tiempo

+0

+1 simple y elegante, solución preferida: esta usa la función de evaluación de fecha incorporada sin la necesidad de coerción a una marca de tiempo numérica – gdibble