但是,当休眠实际持久化到数据库时,日期会转换为本地时间并存储)例如。该值已在实体设置器中设置为“2009-09-09 00:08:08” - GMT 保存到数据库的实际值是“2009-09-08 08:08:08” - 美国东部时间。
好的,首先,无论您使用哪种列类型将日期存储在 MySQL(TIMESTAMP 或 DATETIME)中,都不存储 time zone。来自Re:使用 datetime 存储时区:
其次,除非出现错误行为,否则我的理解是转换应该由服务器或 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' 格式检索和显示 DATETIME 值”。这意味着 mysql 将“自纪元以来的毫秒数”转换为上述格式。所以现在我的问题变成了,时区信息是否也存储在 mysql 中?
我已经更新了我的初始答案(这并不完全准确/详尽)。无论您使用的是 DATETIME 还是 TIMESTAMP,答案是否定的。
我所做的另一个观察是,上述日期“转换”问题仅在我在 Java 应用程序中设置日期时存在。如果我使用 'UTC_TIMESTAMP()' 创建 mysql 触发器来更新/设置日期,则日期将显示在 'UTC' 时间。
UTC_TIMESTAMP ()函数总是返回当前的UTC日期和时间。
我想知道的是:
- 你是如何“揭示”问题的?使用 SQL 客户端还是来自 Java?
- JVM 的本地时区是什么?
- MySQL 服务器时区是什么?
- MySQL JDBC 驱动程序的版本是多少?
- 你能用原始 JDBC 做一个测试吗?