gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:18:16 30 4
gpt4 key购买 nike

环境:

  • 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 GMT1401298706000 = 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com