2014-07-07 123 views
1

我最近觀察到一個奇怪現象,那就是用兩個Java Date對象與equals()進行比較。請注意,this.getDate()和other.getDate()都會在我的應用程序中返回一個Java Date對象。Java中日期對象的比較

代碼:

logger.debug("Date 1: " + this.getDate().toString()); 
logger.debug("Date 1: " + this.getDate().getTime()); 

logger.debug("Date 2: " + other.getDate().toString()); 
logger.debug("Date 2: " + other.getDate().getTime()); 

logger.debug("Dates are equal: " + this.getDate().equals(other.getDate())); 
logger.debug("Dates match in comparison: " + (this.getDate().compareTo(other.getDate()) == 0)); 

輸出:(加空行以提高可讀性)

Date 1: 2014-07-28 00:00:00.0 
Date 1: 1406498400000 

Date 2: Mon Jul 28 00:00:00 CEST 2014 
Date 2: 1406498400000 

Dates are equal: false 
Dates match in comparison: true 

有兩件事情我不明白:

  1. 爲什麼equals()返回false?
  2. 爲什麼toString()的返回值改變其格式?

我檢查的Date.equals(),它說的文檔:

比較兩個日期的相等。當且僅當 參數不爲null並且是一個Date對象,該對象表示與此對象相同的時間點(以毫秒爲單位)時,結果爲true。

因此,當且僅當getTime方法 爲返回相同的long值時,兩個Date對象相等。

我也看了一下Date.equals()的實現:

public boolean equals(Object obj) { 
    return obj instanceof Date && getTime() == ((Date) obj).getTime(); 
} 

那麼,爲什麼equals()回報,即使getTime()回報兩個Date對象?

參考: http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#equals(java.lang.Object)

+0

儘管我不知道爲什麼equals()返回false,您可以隨時切換並使用[compareTo()](http://docs.oracle.com/javase/6/docs/api/java/util/ Date.html#compareTo%28java.util.Date%29)比較日期(我還沒有看到失敗的方法) – rageandqq

+0

toString不改變格式,Date沒有格式的概念,它只是一個容器毫秒數。 toString,ethos simple使用當前本地來顯示此值的表示形式。 – MadProgrammer

+0

你能否更新你的例子來包含'Date()'對象的構造? – merlin2011

回答

8

我想他們不都是Date對象的格式是不同的。

java.sql.Timestamp擴展java.util.Date,但它是一個不同的類並且不相等。

從時間戳

public boolean equals(java.lang.Object ts) { 
    if (ts instanceof Timestamp) { 
    return this.equals((Timestamp)ts); 
    } else { 
    return false; 
    } 
} 

你可能會發現,如果你其他的方式對它們進行比較圍繞它返回true。 :P

嘗試

logger.debug("Dates are equal: " + other.getDate().equals(this.getDate())); 
+0

這可能是原因。看到每個類的'toString()'方法的文檔,'this.getDate()'可能返回一個'java.util.Date',而'other.getDate()'返回'java.sql.Date' – abl

+3

謝謝彼得,你釘了它!日期1是instanceof'java.sql.Timestamp'(和instanceof'java.util.Date')。日期2是instanceof'java.util.Date'。 – user1438038

0

從輸出的toString

顯然,日期1是類的對象java.sql.Date 和date2是java.util中的對象。日期

所以toString輸出是不同的,並且equals()方法提供了false。

因爲(obj instanceof Date)將返回false。

+0

啊,不,'java.sql.Date'是(''instanceof''''util.Date''的一個實例,''java.sql.Date'''從'java.util.Date'繼承而來。事實上,唯一比較失敗的是'Timestamp#equals(Date)',因爲匹配的對象不是'Timestamp'的實例... – MadProgrammer

+0

感謝您的迴應! – Maheedhar