6

我有一个具有 Date 属性的简单实体类。此属性对应于 MySQL 日期时间列。

@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。

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

4

1 回答 1

4

MySQL 文档

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
于 2012-10-13T20:45:02.127 回答