[英]Comparing of Date objects in Java
我最近觀察到一個奇怪的事情,比較兩個Java Date對象與equals()。 請注意,this.getDate()和other.getDate()都將在我的應用程序中返回Java Date對象。
碼:
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
我有兩件事沒有得到:
我檢查了Date.equals()的文檔,其中說:
比較兩個相等的日期。 當且僅當參數不為null並且是一個Date對象時,結果才為真,該對象表示與此對象相同的時間點,以毫秒為單位。
因此,當且僅當getTime方法為兩者返回相同的long值時,兩個Date對象才相等 。
我還看了一下Date.equals()的實現:
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
那么為什么equals()
返回false ,即使getTime()
為兩個Date
對象返回1406498400000 ?
參考: http : //docs.oracle.com/javase/7/docs/api/java/util/Date.html#equals(java.lang.Object)
我猜他們不是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()));
從toString輸出
很明顯,Date1是類java.sql.Date的對象,Date2是java.util.Date的對象
所以toString輸出是不同的,equals()方法給出false。
因為(obj instanceof Date)將返回false。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.