2011-08-30 13 views
39

He intentado buscar personas con preguntas similares, pero no he encontrado nada.JavaScript Fecha Comparaciones No es igual

Tengo dos fechas en JavaScript, ambas configuradas con el mismo valor ... La prueba de igualdad falla en ==, pero> = y < = evalúa verdadero.

A continuación se muestra el código que tengo en juego:

var startDate = new Date(2011, 7, 30, 0, 0, 0, 0); 

var dt = new Date(2011, 7, 30, 0, 0, 0, 0); 

if(startDate == dt) 
    document.write('They Equal<br />'); 

if(startDate > dt) 
    document.write('Start Date is > dt<br />'); 

if(startDate >= dt) 
    document.write('Start Date is >= dt<br />'); 

if(startDate < dt) 
    document.write('Start Date is < dt<br />'); 

if(startDate <= dt) 
    document.write('Start Date is <= dt<br />'); 

if(dt == startDate) 
    document.write('They Equal<br />'); 

if(dt > startDate) 
    document.write('dt > startDate<br />'); 

if(dt >= startDate) 
    document.write('dt >= Start Date <br />'); 

if(dt < startDate) 
    document.write('dt < Start Date <br />'); 

if(dt <= startDate) 
    document.write('dt <= Start Date <br />'); 

document.write(dt); 
document.write('<br />'); 
document.write(startDate); 

Alguien ha encontrado nada como esto, o estoy haciendo algo fundamentalmente equivocado?

Probé esto es Internet Explorer (9), Firefox 5+ y Chrome.

Actualización:

Así que dos personas enviaron grandes respuestas a mi problema, y ​​gracias a los dos: xdazz y DaveRandom. Había leído una publicación anterior en stackoverflow.com sobre una pregunta similar y un tipo dijo que los objetos de fecha podían compararse como cualquier otro, y cualquier otro ejemplo que encontré siempre hizo un tipo de comparación <, nunca una igualdad completa, así que no pude establecer la conexión de por qué lo estaba haciendo mal.

Gracias a ustedes dos, y a los otros que publicaron respuestas similares.

Respuesta

75

Cuando se utiliza <= o >= para comparar dos objetos de fecha, que se comparan a través de valueOf, lo que es lo mismo que getTime para la fecha.

Pero cuando usa ==, son dos objetos diferentes del mismo tipo, por lo que devuelve falso.

Añadido algunos ejemplos:

> new Date(2011, 7, 30, 0, 0, 0, 0) == new Date(2011, 7, 30, 0, 0, 0, 0) 
false 
> new Date(2011, 7, 30, 0, 0, 0, 0).getTime() == new Date(2011, 7, 30, 0, 0, 0, 0).getTime() 
true 
> new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() 
true 
> new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date(2011, 7, 30, 0, 0, 0, 0).getTime() 
true 
38

creo que si lo hace

var startDate = (new Date(2011, 7, 30, 0, 0, 0, 0)).getTime(); 
var dt = (new Date(2011, 7, 30, 0, 0, 0, 0)).getTime(); 

En la parte superior de la secuencia de comandos se encuentra en que funciona.

El método getTime() devuelve la fecha como un entero, lo que está haciendo allí es comparar objetos, en lugar de valores específicos.

EDITAR fijo por encima de código

+0

@Shef Sólo por unos 50 segundos, y yo voy a dar un +1 para sus problemas ;-) – DaveRandom

7
var startDate = new Date(2011, 7, 30, 0, 0, 0, 0); 

var dt = new Date(2011, 7, 30, 0, 0, 0, 0); 

if(startDate.getTime() == dt.getTime()) 
    console.log('They Equal<br />'); 
8

Ésta es una de las muchas partes ilógicas de Javascript. Puede solucionar este problema mediante la conversión de la fecha a un número usando .getTime() que devolverá el número de milisegundos transcurridos desde esa fecha y 00:00:00 del 1 de enero de 1970.

if (a.getTime() === b.getTime()) ... 

El operador === en los objetos ellos mismos regresarán siempre falsos porque esos dos objetos son de hecho distintos objetos javascript mutables.

PD: No utilice el operador == con Javascript. Nunca. Lo que hace lleva el término "loco" a un nivel completamente nuevo. Seriamente.El problema es que todo tipo de conversiones de tipo que simplemente no tienen sentido y, por ejemplo, terminas con cosas como "1"==1, x==false && (x?1:2)==1 o incluso a==b && b==c && a!=c siendo cierto (por ejemplo, con x=[] o con a=[1], b=1, c=[[1]]). Eso sí, no use ==. Nunca. Es "FUBAR". Fullstop.

+0

estoy básicamente de acuerdo con el epílogo, pero debe ser apoyada con algo mucho más significativo, como este : http://www.2ality.com/2011/12/strict-equality-exemptions.html –

-2
<Script> 
function checkval() 
{ 
var strfromdate=document.frmadmin.txtfromdate.value; 
strfromdate=strfromdate.split("/"); 
//alert(strfromdate[2]+" "+strfromdate[0]+" "+strfromdate[1]); 

var strtodate=document.frmadmin.txttodate.value; 
strtodate=strtodate.split("/"); 

var fromDate = (new Date(strfromdate[2], strfromdate[0], strfromdate[1], 0, 0, 0, 0)).getTime(); 
var toDate = (new Date(strtodate[2], strtodate[0], strtodate[1], 0, 0, 0, 0)).getTime(); 
//alert(fromDate+" "+toDate); 



    if(toDate<fromDate) 
    { 
     alert("To date should be greater than from date."); 
     document.frmadmin.txttodate.focus(); 
     return false; 
    } 


    return true; 
} 
</Script>