首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate日期转换

Hibernate日期转换
EN

Stack Overflow用户
提问于 2010-09-07 08:29:09
回答 3查看 14.2K关注 0票数 7

在实体中设置日期字段时,我遇到了一个与hibernate相关的问题。在java程序中,日期被解释为UTC (我做了一个System.out以确保分配的日期是'UTC‘。但是,当hibernate实际保存在数据库中时,日期将转换为本地时间并存储)。该值已在实体设置器中设置为"2009-09-09 00:08:08“- GMT。保存到数据库的实际值为"2009-09-08 08:08:08”-美国东部时间。我无法找出这种情况发生的地点和原因,以及如何防止它。谢谢

附注:我正在使用joda日期库,并用类型注释字段(@org.hibernate.annotations.Type= "org.joda.time.contrib.hibernate.PersistentDateTime")

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-07 09:12:12

然而,当hibernate实际上保存在数据库中时,日期被转换为本地时间并存储)例如。该值已在实体设置器中设置为"2009-09-09 00:08:08“- GMT。保存到数据库的实际值为"2009-09-08 08:08:08”-美国东部时间。

首先,无论您使用哪种列类型在MySQL中存储日期(TIMESTAMP或DATETIME),都不会存储时区。来自Re: Storing timezone with datetime

  • 时间戳是1970年以来的秒数,以4字节为单位。它存储在GMT中。也就是说,TZ偏移量在您存储值时应用,然后在获取它时重新应用。(...)

  • DATETIME是一个8字节的数字字符串"yyyymmddhhmmss“。(...)

其次,除非是buggy behavior,否则我的理解是,根据the server time zone设置,转换应该由服务器或JDBC驱动程序完成,这样您就不会得到不一致的数据。

在这两种情况下,我的观点是存储"2009-09-09 00:08:08“- GMT或"2009-09-08 08:08:08”-来自Java的美国东部时间应该在数据库中得到相同的值。

然而,当显示时,它看起来像是完成了不同的转换。这就引出了一个问题:您实际上是如何检查“持久化日期”的值的。“问题”发生在你的SQL客户端上吗?在Java代码中?

参考文献

  • 9.6. MySQL Server Time Zone Support
  • 21.3.4.1. Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J
  • Bug #15604: TimeZone discarded storing java.util.Calendar into DATETIME

针对DateTime的

MySQL文档中写道:"MySQL以'YYYY-MM-DD HH:MM:SS‘格式检索和显示日期时间值“。这意味着mysql会将“自纪元以来的毫秒数”转换为上述格式。所以现在我的问题变成了,时区信息也存储在mysql中吗?

我已经更新了我的初始答案(不是完全准确/详尽)。无论您使用的是日期时间还是时间戳,答案都是否定的。

我观察到的另一个问题是,只有当我在

应用程序中设置日期时,上述日期‘转换’问题才存在。如果我使用'UTC_TIMESTAMP()‘创建一个mysql触发器来更新/设置日期,日期将以'UTC’时间显示。

UTC_TIMESTAMP()函数always返回当前的UTC日期和时间。

我想知道的是:

  • 你是如何“揭示”这个问题的?使用SQL客户端还是从Java?
  • JVM的本地时区是什么?
  • 什么是MySQL服务器时区?
  • MySQL JDBC Driver?
  • Could的版本是什么?您使用原始JDBC进行测试?
票数 3
EN

Stack Overflow用户

发布于 2016-11-08 21:09:27

为了在DB中将日期视为协调世界时(用于读/写),您可以使用这个小型开源库DbAssist。它使用自定义的UtcDateType来映射实体中的java.util.Date字段,以便Hibernate将它们视为DB中的UTC域。由于您使用的是JPA注释,因此您将使用以下依赖项:

代码语言:javascript
运行
复制
<dependency>
    <groupId>com.montrosesoftware</groupId>
    <artifactId>DbAssist-5.2.2</artifactId>
    <version>1.0-RELEASE</version>
</dependency>

应用修复很简单,例如,当使用Spring Boot时,您必须确保在应用程序类之前有@EnableAutoConfiguration注释。如果您使用的是其他Hibernate版本,只需参考github wiki以找到正确版本的修复程序和安装指南。您还可以在此article中阅读有关时区转换问题的更多信息。

票数 1
EN

Stack Overflow用户

发布于 2011-04-17 04:58:41

Joda Time Contrib的这种行为在我的项目Usertype for Joda Time和JSR310中得到了修复。请参阅http://usertype.sourceforge.net/,它实际上是JodaTime Hibernate的一小部分替代品。

我写过关于这个问题的文章:http://blog.jadira.co.uk/blog/2010/5/1/javasqldate-types-and-the-offsetting-problem.html

希望这能帮上忙

克里斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3655036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档