java - 如何将对象与 Date 变量进行比较(Hibernate)? java.util.Date 与 java.sql.Timestamp

标签 java hibernate date jakarta-ee timestamp

环境:

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

从现在开始,数据库负责存储时间戳,并非所有版本都能够处理毫秒。

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/

相关文章:

java - Java中使用Neo4jGraph.open()或GraphFactory.open()访问远程Neo4j数据库

hibernate - Grails CriteriaBuilder 添加限制

php - 获取表中的行数时出现问题,其中日期大于值

javascript - Firefox 和 IE 中的日期问题

java - 如何在日期解析(Java)中忽略时区标识符?

java - 谷歌地图字符编码问题

java - java.util.regex 是否缓存已编译的模式?

java - RSA加密——寻找P和Q

java - @GeneratedValue 和 @GenericGenerator 之间的区别

java - 杀死处于 sleep 状态的Mysql进程命令