2012-10-13 136 views
5

我有一個具有Date屬性的簡單實體類。該屬性對應於MySQL日期時間列。數據庫中的保留日期不等於檢索日期

@Entity 
public class Entity { 

    @Column(name = "start_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private java.util.Date startDate; 

} 

這是一個集成測試,我寫的樣子:

​​

我希望這兩個日期是平等的,但他們都沒有!其實我有:

now.getTime() = 1350160029831 
entity.getStartDate().getTime() = 1350160029000 

所以這兩個日期之間有一個小差距。我真的很想知道這種差距可能來自哪裏。它並不總是相同的,每次我開始測試過程時都會有所不同。 在我的數據庫中,存儲的日期是2012-10-13 22:15:38.0。

我真的需要在某個地方清除毫秒嗎?

回答

3

MySQL documentation

datetime或時間戳值可以包括在高達微秒(6位)精度的後小數 秒一部分。雖然這個小數部分被識別出來,但它會從存儲在DATETIME或TIMESTAMP列中的值中丟棄。有關MySQL中支持小數部分 秒的信息,請參見第11.1.5.6節「 時間值中的小數秒」。

請注意,你不應該使用等於反正比較日期,因爲不同日期的子類有馬車的實現,這會造成問題,如a.equals(b) && !b.equals(a)

java.util.Date d1 = java.sql.Date.valueOf("2012-01-01"); 
java.util.Date d2 = new java.util.Date(d1.getTime()); 
java.util.Date d3 = new java.sql.Timestamp(d1.getTime()); 

System.out.println(d1.equals(d2)); // true 
System.out.println(d2.equals(d1)); // true 
System.out.println(d1.equals(d3)); // true 
System.out.println(d3.equals(d1)); // false 
System.out.println(d2.equals(d3)); // true 
System.out.println(d3.equals(d2)); // false 
+0

所以我應該蓋德擺脫毫秒部分像這樣:Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.MILLISECOND,0); – Tunaki