2011-09-30 494 views
61

在Javascript中比較日期對象時,我發現即使比較同一日期也不會返回true。JavaScript日期對象比較

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 

我怎麼能比較這些日期的平等?我有興趣使用JS的本地對象Date,而不是任何第三方庫,因爲它不適合使用第三方JS來比較日期。

+8

的這是如何在JavaScript設計不當很好的例子。 – devios1

回答

96

這是因爲在第二種情況下,比較實際的日期對象,並且兩個對象永遠不會相互等同。強迫他們以數:

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

如果你想要一個更明確地轉換爲數字,請使用:

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

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

哦,規範的引用:§11.9 .3 The Abstract Equality Comparison Algorithm基本上說比較對象時,obj1 == obj2只有當它們指向同一個對象時才爲真,否則結果爲false。

+0

我被提高了答案,但在您的示例中使用_strict equals_運算符'==='更正確嗎? –

+5

@AndrewD。在這種特殊情況下使用strict equals對結果沒有任何影響,這是因爲示例中的equals運算符總是處理相同類型的操作數,@ RobG將顯式地將值轉換爲Number(示例1和3)或者在示例2中,我們知道'Date.prototype.getTime'將始終返回一個數字... – CMS

+0

@RobG:當您說「obj1 == obj2'僅當它們引用同一對象時才爲true 「,這是否意味着比較(如果兩個操作數都是對象)不會測試平等,而是測試身份?我的理解是正確的嗎? –

16

比較使用getTime()日期返回從毫秒爲單位的數目(即數量):

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 

還要考慮使用Date構造採取明確的年/月/日數而不是依賴於字符串表示(見:Date.parse() )。請記住,JavaScript中的日期始終使用客戶端(瀏覽器)時區表示。

+1

對於使用字符串作爲Date()的參數的註釋+1。 – RobG

4

你可以比較實際的毫秒:

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

你並不需要使用的getTime方法 - 你可以從另一個日期對象減去一個日期對象。這將返回毫秒差(負,如果第二個是較後日期)

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

var diff= (startDate1 -startDate2) 

//計算結果爲0,如果日期具有相同的時間戳

+0

+1簡單而優雅的imo首選解決方案:它使用內置的Date評估功能,而不需要強制轉換爲數字時間戳 – gdibble