你好,我有一段代碼是這樣的:java.sql.Timestamp比較錯誤?
Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));
輸出看起來是這樣的:
Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false
有什麼不對的java.sql.Timestamp中的類?
是的,我已經看到這一點:
注意:該類型是java.util.Date的複合和單獨的納秒值。只有整數秒存儲在java.util.Date組件中。小數秒 - 納米 - 是分開的。 Timestamp.equals(Object)方法在傳遞類型爲java.util.Date的值時從不返回true,因爲日期的nanos組件未知。因此,Timestamp.equals(Object)方法相對於java.util.Date.equals(Object)方法不對稱。此外,hashcode方法使用底層的java.util.Date實現,因此在其計算中不包含nanos。
由於上面提到的Timestamp類和java.util.Date類之間的差異,建議代碼不要將Timestamp值一般視爲java.util.Date的實例。 Timestamp和java.util.Date之間的繼承關係實際上表示實現繼承,而不是類型繼承。
但它是用於日期< - >時間戳關係。
在我的例子,我只有時間戳記,並且仍然行爲是意外..
UPDATE:ANSWER
出現這種情況的原因是before()
方法被重載,在java.sql.Timestamp
未覆蓋。 我期待着'重載'的行爲。 比較時間戳的正確方法是使用時間戳變量,而不是日期。
這仍然是在Java核心較差的設計決策,自繼承應該意味着時間戳是-一個日期,沒有懲罰和例外..
我相信我的能力在另一篇文章中發現了這個問題。請[查看](http://stackoverflow.com/a/13141377/1758149)。問題是你不應該把'TimeStamp'作爲一個日期。 – RyPope 2013-03-26 04:17:27