数据库中的持久日期不等于检索日期

时间:2012-10-13 20:32:40

标签: java mysql hibernate

我有一个简单的实体类,它有一个Date属性。此属性对应于MySQL datetime列。

@Entity
public class Entity {

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

}

这就是我写的集成测试:

java.util.Date now = new java.util.Date();
Entity entity = new Entity();
entity.setStartDate(now);
entityService.save(entity); // save entity to database
entity = entityService.get(entity.getId()); // get entity back from database
Assert.assertEquals(entity.getStartDate(), now);

我希望这两个日期相同,但事实并非如此!实际上,我有:

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

所以两个日期之间有一个小的差距。我真的很想知道这个差距可能来自哪里。它并不总是相同的,每次我开始测试过程都会有所不同。 在我的数据库中,存储的日期是2012-10-13 22:15:38.0。

我真的需要在某处清除毫秒吗?

1 个答案:

答案 0 :(得分:3)

来自MySQL documentation

  

DATETIME或TIMESTAMP值可以包括尾随小数   秒部分精确到微秒(6位)。虽然这个   小数部分被识别,它从存储的值中被丢弃   DATETIME或TIMESTAMP列。有关分数的信息   MySQL中的秒支持,请参见第11.1.5.6节“分数秒”   时间价值“。

请注意,您不应该使用equals来比较日期,因为各种Date子类都有错误的实现,这会导致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