gpt4 book ai didi

java - hibernate 日期转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:24 24 4
gpt4 key购买 nike

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

附言我正在使用 joda 日期库并用@org.hibernate.annotations.Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")

最佳答案

However, when hibernate actually persists to the database, the date is converted to local time and stored) ex. the value has been set in the entity setter as "2009-09-09 00:08:08" - GMT the actual value persisted to the database is "2009-09-08 08:08:08" - eastern time US.

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

  • TIMESTAMP is seconds since 1970, sitting in 4 bytes. It is stored in GMT. That is, the TZ offset is applied as you store a value, then reapplied when you fetch it. (...)

  • DATETIME is an 8-byte string of digits "yyyymmddhhmmss". (...)

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

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

但是,当显示它们时,似乎进行了不同的转换。这就引出了一个问题:您实际上是如何检查“保留日期”的值的。 “问题”是否出现在您的 SQL 客户端中?在 Java 代码中?

引用资料


MySQL documentation for DateTime says "MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format". That means mysql converts the 'milliseconds since epoch' to the above format. So now my question becomes, is timezone info also stored in mysql?

我已经更新了我的初始答案(不完全准确/详尽无遗)。无论您使用的是 DATETIME 还是 TIMESTAMP,答案是否定的。

Another observation I made is, the above date 'conversion' issue exists only when Im setting the date in the Java application. If I create a mysql trigger to update/set date using 'UTC_TIMESTAMP()', the date is displayed in the 'UTC' time.

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


我想知道的是:

  • 您是如何“揭示”问题的?使用 SQL 客户端还是来自 Java?
  • JVM 的本地时区是什么?
  • MySQL 服务器的时区是什么?
  • MySQL JDBC 驱动程序的版本是多少?
  • 你能用原始 JDBC 做一个测试吗?

关于java - hibernate 日期转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655036/

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