环境:
我在检查2个对象是否相等时遇到问题,问题是由de variable Date引起的。
我正在使用Hibernate,它似乎是Timestamp(纳秒)和Date(毫秒)的问题。
当我创建对象时,任务日期与我从数据库中检索对象时不同。
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
有什么想法吗?
答案 0 :(得分:1)
从你的例子:
1401298705937 = 2014年5月28日星期三17:38:25 GMT 1401298706000 = 2014年5月28日星期三17:38:26 GMT
这意味着数据库只是剥离了毫秒。
都映射到JDBC TIMESTAMP。
从现在开始,它是负责存储时间戳而不是所有版本的数据库能够处理毫秒。
TIMESTAMP数据类型用于包含date和的值 时间部分。 TIMESTAMP的范围是'1970-01-01 00:00:01'UTC到 '2038-01-19 03:14:07'UTC。
是否使用MySQL 5.5或更低版本?
答案 1 :(得分:0)
在此之前,使用Hibernate将日期插入MySQL
1401298705937 = Wed, 28 May 2014 17:38:25 GMT
之后,使用Hibernate从MySQL恢复日期
1401298706000 = Wed, 28 May 2014 17:38:26 GMT
日期值已从1401298705937(milis)四舍五入到1401298706000(milis),这就是为什么对象不是compareTo()== 0
解决方案我发现,在设置Date或Timestamp之前排除milis并使用hibernate保存对象。
new java.util.Date((date.getTime()/1000)*1000)