2011-08-30 100 views
39

我試過尋找有類似問題的人,但還沒有找到任何東西。JavaScript日期比較不等於

我在JavaScript中有兩個日期,都設置爲相同的值... Equality Testing在==上失敗,但> =和< =評估爲true。

下面是我在比賽中的代碼:

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

有沒有人遇到這樣的事,還是我做一些根本性的錯誤?

我測試過這是Internet Explorer(9),Firefox 5+和Chrome。

更新:

所以兩個人貼偉大的答案我的問題,我感謝你們倆:xdazz和DaveRandom。我已經閱讀了一個類似問題stackoverflow.com上的一篇文章,一個傢伙說,日期對象可以像任何其他的比較,我發現任何其他例子總是做了<或>類型的比較,從來沒有一個完整的平等,所以我無法確定我爲什麼做錯了。

感謝你們兩位以及其他發佈類似答案的人。

回答

75

當您使用<=>=來比較兩個Date對象固定,它們通過valueOf相比,這是一樣的getTime的日期。

但是當你使用==時,它們是同一類型的兩個不同的對象,所以它返回false。

增加了一些例子:

> 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

我想,如果你這樣做

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

在腳本的頂部,你會發現它的作品。

getTime()方法以整數形式返回日期,您在那裏做的是比較對象而不是特定的值。

編輯上面的代碼

+0

@Shef只有約50秒,我給你的麻煩;-) – 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

這是使用Javascript的許多不合理的部分之一。您可以解決此問題的日期轉換爲使用.getTime()將返回多少毫秒自該日和1月1日的00:00:00通過多項,1970年

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

===操作上的對象它們本身將總是返回false,因爲這兩個對象確實是不同的可變JavaScript對象。

PS:請勿在Javascript中使用==運算符。永遠。它將「瘋狂」這個詞帶到了一個全新的高度。認真。問題在於,所有類型的轉換都是毫無意義的,例如,您最終得到"1"==1,x==false && (x?1:2)==1或甚至a==b && b==c && a!=c爲真(例如x=[]a=[1], b=1, c=[[1]])。只是不要使用==。永遠。這是「FUBAR」。句號。

+0

我大多使用PostScript同意,但它應該這樣來支持更有意義,這樣的+1 :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>