【发布时间】:2018-03-08 20:47:38
【问题描述】:
使用 JPA CriteriaBuilder API 将 LocalDate 字段(例如“2017-09-27”)保存到 mySQL Date 列时,结果不同(例如“2017-09-26”)。
我已使用 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) 验证我的数据库的时区设置为 UTC,因为结果是 '00:00:00'。
我在本地对此进行测试,并且我的时区为 GMT + 2,所以我怀疑当从 LocalDate 转换到 Date 时,会扣除 2 小时并在日期前 1 天生成日期请求的日期(假设 LocalDate 字段,由于它没有没有时间信息,被视为 00:00:00。
在这种情况下保存 LocalDates 的最佳方法是什么?我是否应该遵循https://stackoverflow.com/a/29751575/3832047 此处的建议并将所有 LocalDate 字段明确设置为 UTC 或类似的东西?
我进行了测试,看看在代码中转换它们时会发生什么,并得到以下结果:
Date convertedDate = Date.valueOf(localDate);
编辑
这是我用来检索数据的代码示例,其中也发生了奇数日期更改。如果我请求2017-06-27 的数据,我会收到2017-06-26 的结果。
CriteriaBuilder criteriaBuilder = sessionFactory.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HorseAndTrailerRequest.class);
Root<HorseAndTrailerRequest> criteria = criteriaQuery.from(HorseAndTrailerRequest.class);
ParameterExpression<LocalDate> effectiveDateParameter = criteriaBuilder.parameter(LocalDate.class);
criteriaQuery.select(criteria)
.where(
criteriaBuilder.equal(criteria.get("effectiveDate"), effectiveDateParameter)
);
TypedQuery<HorseAndTrailerRequest> query = sessionFactory.getCurrentSession().createQuery(criteriaQuery);
query.setParameter(effectiveDateParameter, date);
return query.getResultList();
【问题讨论】:
-
Java
LocalDate对象不存储时间或时区信息(请参阅Javadoc],我怀疑还有别的东西。 -
您能否尝试运行以下命令来确认您的 MySQL 服务器时区:
SELECT @@system_time_zone, NOW(), UTC_TIMESTAMP() -
@TimBiegeleisen 结果是
UTC | 2017-09-27 11:28:51 | 2017-09-27 11:28:51。 -
我赞成你的问题,但在这一点上,我认为我们需要查看将本地日期保存到 MySQL 中的 Java 代码。
-
好的,谢谢,它也发生在读取上 - 当查询请求来自“2017-09-27”的数据时,我只接收来自“2017-09-26”的数据,非常奇怪的行为.我将通过阅读示例来编辑问题。
标签: mysql java-8 jpa-2.0 hibernate-5.x localdate