2013-03-26 97 views
10

你好,我有一段代碼是這樣的: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核心較差的設計決策,自繼承應該意味着時間戳是-一個日期,沒有懲罰和例外..

+0

我相信我的能力在另一篇文章中發現了這個問題。請[查看](http://stackoverflow.com/a/13141377/1758149)。問題是你不應該把'TimeStamp'作爲一個日期。 – RyPope 2013-03-26 04:17:27

回答

2

嘗試使用Timestamp而不是Date,它會工作。

Timestamp d1 = new java.sql.Timestamp(new Date().getTime()); 

TimestampDate都有自己的實現方法before的。覈實。

3

嗯,這似乎爲下記錄特徵。

beforeafter方法Timestamp似乎是比較到第二,但沒有考慮到毫秒部分。嘗試運行它,直到TimeStamp落入不同的秒數,並且比較按預期工作(將睡眠增加到500以使其更容易)。

順便說一下,compareTo方法正在考慮毫秒,所以你可以用它來代替。

1

如果您調用方法Timestamp.before(Timestamp),您會得到預期的結果。

但很顯然,使用TimestampDate將是一個四周陷入困境。您必須使用Timestamp作爲Timestamp靜態