我最近觀察到一個奇怪現象,那就是用兩個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
有兩件事情我不明白:
- 爲什麼equals()返回false?
- 爲什麼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)
儘管我不知道爲什麼equals()返回false,您可以隨時切換並使用[compareTo()](http://docs.oracle.com/javase/6/docs/api/java/util/ Date.html#compareTo%28java.util.Date%29)比較日期(我還沒有看到失敗的方法) – rageandqq
toString不改變格式,Date沒有格式的概念,它只是一個容器毫秒數。 toString,ethos simple使用當前本地來顯示此值的表示形式。 – MadProgrammer
你能否更新你的例子來包含'Date()'對象的構造? – merlin2011