2009-07-18 147 views
4

我的東西比較日期是這樣的:比較JavaScript的日期

var dt = new Date();  

dt.setDate("17");    
dt.setMonth(06); 
dt.setYear("2009"); 

var date = new Date(); 

console.log("dt(%s) == date(%s) == (%s)", dt, date, (dt == date)); 

if(now == dt) { 
    .... 
} 

字符串值是動態的,當然。

在日誌中我看到:

dt(Fri Jul 17 2009 18:36:56 GMT-0500 (CST)) == date(Fri Jul 17 2009 18:36:56 GMT-0500 (CST) == (false) 

我試過.equals(),但它沒有工作(我嘗試的JavaScript的Java的一部分:P)

我如何比較這些日期,以便它們返回true?

+0

「現在」變量在哪裏?你可能想要使用var now = new Date(); – SolutionYogi 2009-07-18 00:10:55

回答

8

下面的代碼應該可以解決你的問題:

(myDate.getTime() == myOtherDate.getTime()) 

的問題是,當你寫:

(myDate == myOtherDate) 

...你居然問:「是myDate指向同一個對象myOtherDate指向?「,而不是」myDatemyOtherDate?「相同。

的解決方案是使用getTime以獲得表示日期對象的數字(並且由於getTime返回因爲曆元時間的毫秒數,這個數將是日期對象的確切表示),然後使用這個號碼爲比較(比較數字將按預期工作)。

史蒂夫

+0

我應該考慮在這個過程中實際上可能會損失幾毫秒嗎? ? – OscarRyz 2009-07-18 00:04:22

+0

史蒂夫,你說的==日期的操作符是不正確的。這不是C#或JAVA。問題是每個Date組件有不同的時間關聯,並且比較結果爲false。 – SolutionYogi 2009-07-18 00:09:46

3

與您的代碼的問題是,你是不是隻比較日期的時間/日期部分。如果保留的循環代碼(通過「延時代碼-start」標識)

var myDate = new Date(); 
    myDate.setDate(17); 
    myDate.setMonth(7); 
    myDate.setYear(2009); 

    //Delay code - start 
    var total = 0; 
    for(var i=0; i<10000;i++) 
     total += i; 
    //Delay code - end 

    var now = new Date(); 

    console.log(now.getTime() == myDate.getTime()); 

,控制檯會顯示「假」,如果你刪除的循環代碼,控制檯將:

試試這個代碼即使在myDate是7/17/2009和'now'是7/17/2009的情況下,都是'真'。

問題是JavaScript日期對象存儲日期和時間。如果您只想比較日期部分,則必須編寫代碼。

function areDatesEqual(date1, date2) 
{ 
    return date1.getFullYear() == date2.getFullYear() 
      && date1.getMonth() == date2.getMonth() 
      && date1.getDate() == date2.getDate(); 
} 

如果兩個javascript'日期部分'相等忽略相關時間部分,則此函數將打印'true'。

0
=> (myDate.getTime() == myOtherDate.getTime()) 

(myDate == myOtherDate)不起作用,它的兩個對象(指針),而不是它們所包含的值進行比較。使用getTime獲取Date的整數表示然後進行比較。