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

2024-05-14

我有一个具有 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。

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


来自MySQL 文档 https://dev.mysql.com/doc/refman/5.0/en/datetime.html:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库中的持久日期不等于检索日期 的相关文章

随机推荐