我有一个简单的实体类,它有一个 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。
我真的需要在某处清除毫秒数吗?
最佳答案
A DATETIME or TIMESTAMP value can include a trailing fractional seconds part in up to microseconds (6 digits) precision. Although this fractional part is recognized, it is discarded from values stored into DATETIME or TIMESTAMP columns. For information about fractional seconds support in MySQL, see Section 11.1.5.6, “Fractional Seconds in Time Values”.
请注意,无论如何您都不应该使用 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
关于java - 数据库中的持久化日期不等于检索日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876726/