2012-10-13 86 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