环境:
- MySql 5.6.14
- Spring MVC
- hibernate
我在检查 2 个对象是否相等时遇到问题,问题是由变量 Date 引起的。
我用的是Hibernate,好像是时间戳(纳秒)和日期(毫秒)的问题。
创建对象时的任务日期与从数据库中检索对象时的日期不同。
java.util.Date date = new java.util.Date();
java.sql.Date datesql = new java.sql.Date(date.getTime());
java.util.Date stamp = new java.sql.Timestamp(date.getTime());
Date rightnow = stamp;//Calendar.getInstance().getTime();
Task t1 = new Task("My first task", "This is a task", rightnow,
rightnow, category, priority, state, user, user, "okey", 0);
Task t2 = new Task("My second task", "This is a task", date,
rightnow, category, priority, state, user, user, "okey", 0);
Task t3 = new Task("My third task", "This is a task", datesql,
rightnow, category, priority, state, user, user, "okey", 0);
taskDao.saveOrUpdate(t1);
taskDao.saveOrUpdate(t2);
taskDao.saveOrUpdate(t3);
taskDao.saveOrUpdate(t4);
List<Task> tasks = taskDao.getAllTasks();
assertEquals("Should be 4 tasks.", 4, tasks.size());
Task taskR1 = taskDao.get(t1.getIdTask());
Task taskR2 = taskDao.get(t2.getIdTask());
Task taskR3 = taskDao.get(t3.getIdTask());
//Dates before saving objects in database
System.out.println("l timestamp> "+rightnow.getTime());
System.out.println("l date > "+date.getTime());
System.out.println("l datesql > "+datesql.getTime());
//Dates from retrieved objects
System.out.println("l tr1date > "+taskR1.getDate().getTime());
System.out.println("l tr2date > "+taskR2.getDate().getTime());
System.out.println("l tr3date > "+taskR3.getDate().getTime());
这段代码的结果
//Dates before saving objects in database
l timestamp> 1401298705937
l date > 1401298705937
l datesql > 1401298705937
//Dates from retrieved objects
l tr1date > 1401298706000
l tr2date > 1401298706000
l tr3date > 1401298706000
问题是比较 1401298705937(保存对象前的日期)和 1401298706000(保存对象后的日期)是不同的。
我也尝试过使用 compareTo 和 equals 函数
System.out.println("t3.getDate().compareTo(taskR3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("t3.getDate().equal(taskR3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().compareTo(t3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().equal(t3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
结果为假,对象 t1、t2 和 taskR1、taskR2 也是如此。
t3.getDate().compareTo(taskR3.getDate()) == 0 :false
t3.getDate().equal(taskR3.getDate()) == 0 :false
taskR3.getDate().compareTo(t3.getDate()) == 0 :false
taskR3.getDate().equal(t3.getDate()) == 0 :false
有什么想法吗?
最佳答案
以你为例:
1401298705937 = 2014 年 5 月 28 日星期三 17:38:25 GMT 1401298706000 = 2014 年 5 月 28 日星期三 17:38:26 GMT
这意味着 DB 只是简单地剥离了 millis。
根据 Hibernate docs :
- java.util.Date
- java.sql.时间戳
- java.util.日历
都映射到 JDBC TIMESTAMP。
从现在开始,数据库负责存储时间戳,并非所有版本都能够处理毫秒。
- PostgreSQL 有 microsecond precision.
- MySQL 5.6 最近刚刚添加了fractional seconds support , 而 previous versions存储没有毫秒的时间戳:
The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
您使用的是 MySQL 5.5 或更低版本吗?
关于java - 如何将对象与 Date 变量进行比较(Hibernate)? java.util.Date 与 java.sql.Timestamp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918610/