2011-08-30 11 views
39

Ho provato a cercare persone con domande simili, ma non ho trovato nulla.Confronto data JavaScript non uguale a

Ho due date in JavaScript, entrambe impostate sullo stesso valore ... Test di uguaglianza non riesce su ==, ma> = e < = valuta vero.

Di seguito è il codice che ho in gioco:

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); 

Qualcuno ha riscontrato nulla di simile, o sto facendo qualcosa di fondamentalmente sbagliato?

Ho provato questo è Internet Explorer (9), Firefox 5+ e Chrome.

Aggiornamento:

Così due persone postato grandi risposte al mio problema, e ringrazio tutti e due: xdazz e DaveRandom. Ho letto un precedente post su stackoverflow.com su una domanda simile e un tizio ha detto che gli oggetti data possono essere confrontati come qualsiasi altro, e qualsiasi altro esempio che ho trovato ha sempre fatto un confronto di tipo <>, mai un'eguaglianza completa non era in grado di stabilire il motivo per cui stavo sbagliando.

Grazie a voi due e agli altri che hanno pubblicato risposte simili.

risposta

75

Quando si utilizza <= o >= per confrontare due oggetti di data, vengono confrontati tramite valueOf, che è lo stesso che getTime per Data.

Ma quando si utilizza ==, si tratta di due diversi oggetti dello stesso tipo, quindi restituisce false.

aggiunti alcuni esempi:

> 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

penso che se lo fai

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

Nella parte superiore dello script troverete funziona.

Il metodo getTime() restituisce la data come numero intero, ciò che si sta facendo è il confronto di oggetti, piuttosto che valori specifici.

EDIT fissato sopra il codice

+0

@Shef Solo circa 50 secondi, e io ti do un +1 per i tuoi guai ;-) – 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

Questa è una delle molte parti illogiche di Javascript. È possibile aggirare il problema convertendo la data a un numero utilizzando .getTime() che restituirà quanti millisecondi passati da quella data e 00:00:00 del 1 gennaio, 1970.

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

L'operatore === sugli oggetti essi stessi ritorneranno sempre falsi perché questi due oggetti sono in effetti degli oggetti javascript mutevoli.

PS: non utilizzare l'operatore == con Javascript. Mai. Ciò che fa prende il termine "pazzo" a un livello completamente nuovo. Sul serio.Il problema è che tutti i tipi di conversioni di tipo semplicemente non hanno senso e, ad esempio, si finisce con cose come "1"==1, x==false && (x?1:2)==1 o anche a==b && b==c && a!=c (ad esempio con x=[] o con a=[1], b=1, c=[[1]]). Basta non usare ==. Mai. È "FUBAR". Punto.

+0

Io per lo più d'accordo con la postilla, ma dovrebbe essere sostenuto con qualcosa di molto più significativo, come questo : 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>