2017年3月9日 星期四

TimeStamp和Date的時間比對

最近發現一件值得注意的事

假設一個狀況

現在想要從資料庫中抓出資料,資料中有時間欄位,我想要比對時間,所以會用某個Date.equal()來比對資料的那個時間欄位的時間

但會發現Date表示的時間跟資料的時間是一樣的時候,Date.equal卻回傳false

原因可以在官方文件中找到
Note: This type is a composite of a java.util.Date and a separate nanoseconds value. Only integral seconds are stored in the java.util.Date component. The fractional seconds - the nanos - are separate. The Timestamp.equals(Object) method never returns true when passed a value of type java.util.Date because the nanos component of a date is unknown. As a result, the Timestamp.equals(Object) method is not symmetric with respect to the java.util.Date.equals(Object) method. Also, the hashcode method uses the underlying java.util.Date implementation and therefore does not include nanos in its computation.

簡言之:
資料從資料庫中取出後用get方法取得的時間會是java.sql.TimeStamp型態

java.sql.TimeStamp繼承java.util.Date

但TimeStamp內部其實還有個紀錄奈秒的欄位,而Date沒有

所以TimeStamp.equal(Date)必定會是false,因為比對奈秒欄位的時候,Date沒有奈秒欄位可以比

所以可行的做法:
1.Date.equal(TimpStamp)
2.Date.getTime() == TimeStamp.getTime()  (反之亦然)

不可行的作法:
TimeStamp.equal(Date)

沒有留言:

張貼留言