在实体中设置日期字段时,我遇到了一个与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")
发布于 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
其次,除非是buggy behavior,否则我的理解是,根据the server time zone设置,转换应该由服务器或JDBC驱动程序完成,这样您就不会得到不一致的数据。
在这两种情况下,我的观点是存储"2009-09-09 00:08:08“- GMT或"2009-09-08 08:08:08”-来自Java的美国东部时间应该在数据库中得到相同的值。
然而,当显示时,它看起来像是完成了不同的转换。这就引出了一个问题:您实际上是如何检查“持久化日期”的值的。“问题”发生在你的SQL客户端上吗?在Java代码中?
参考文献
针对DateTime的
MySQL文档中写道:"MySQL以'YYYY-MM-DD HH:MM:SS‘格式检索和显示日期时间值“。这意味着mysql会将“自纪元以来的毫秒数”转换为上述格式。所以现在我的问题变成了,时区信息也存储在mysql中吗?
我已经更新了我的初始答案(不是完全准确/详尽)。无论您使用的是日期时间还是时间戳,答案都是否定的。
我观察到的另一个问题是,只有当我在
应用程序中设置日期时,上述日期‘转换’问题才存在。如果我使用'UTC_TIMESTAMP()‘创建一个mysql触发器来更新/设置日期,日期将以'UTC’时间显示。
UTC_TIMESTAMP()函数always返回当前的UTC日期和时间。
我想知道的是:
发布于 2016-11-08 21:09:27
为了在DB中将日期视为协调世界时(用于读/写),您可以使用这个小型开源库DbAssist。它使用自定义的UtcDateType来映射实体中的java.util.Date字段,以便Hibernate将它们视为DB中的UTC域。由于您使用的是JPA注释,因此您将使用以下依赖项:
<dependency>
<groupId>com.montrosesoftware</groupId>
<artifactId>DbAssist-5.2.2</artifactId>
<version>1.0-RELEASE</version>
</dependency>应用修复很简单,例如,当使用Spring Boot时,您必须确保在应用程序类之前有@EnableAutoConfiguration注释。如果您使用的是其他Hibernate版本,只需参考github wiki以找到正确版本的修复程序和安装指南。您还可以在此article中阅读有关时区转换问题的更多信息。
发布于 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
希望这能帮上忙
克里斯
https://stackoverflow.com/questions/3655036
复制相似问题