2011-07-23 43 views
4
Foo a; 
... 
Date b = a.getDate(); 
Date c = new Date(b.getTime()); 

if (b.equals(c)) System.out.println("equal"); 
else System.out.println("not equal"); 

System.out.println(b.toString()); 
System.out.println(b.getTime()); 
System.out.println(c.toString()); 
System.out.println(c.getTime()); 

上面打印:java.util.Date的行爲

not equal 
2011-07-23 22:24:21.834 
1311459861834 
Sat Jul 23 22:24:21 
1311459861834 

這是爲什麼?這是Date中的錯誤嗎?這很難相信。

+2

你可以做一個System.out.println(b.getClass())(並打印c類也)? – SJuan76

+0

也是,看到答案的c.equals(b) – SJuan76

+0

的結果我看到另一個不喜歡Java庫中的Date實現的原因 –

回答

6

a.getDate()顯然返回java.sql.Timestamp

java.sql.Timestamp有不同的equals方法比java.uti.Date這基本上是

return obj instanceof Date && getTime() == ((Date) obj).getTime();

Timestamp不過是更復雜的,它需要的目標是Timestamp了。

if (ts instanceof Timestamp) { 
    return this.equals((Timestamp)ts);//the impl checks nanos too 
    } else { 
    return false; 
    } 

你可能使用Hibernate或者類似的東西,仍然存在java.util.DateTimestamp

4

a.getDate()可能不會返回java.util.Date而是其他的東西,它擴展了它。

這會解釋奇怪的b.toString()b.equals(c)行爲。

+0

當然,這是原因,因爲即使他們的toString方法使用不同的格式。 –

+0

'equals()'只會在子類覆蓋它時纔會出錯,因爲'getTime()'顯然返回正確的值 –

+0

你們是對的。它返回時間戳,這是奇怪行爲的原因。 –

2

這是唯一可能的,如果a.getDate()返回Date的子類,如java.sql.Date

+1

它是Timestamp,可以從'toString()' – bestsss

相關問題