gpt4 book ai didi

mysql - 返回的日期值与数据库中存储的日期值不同

转载 作者:行者123 更新时间:2023-11-29 09:26:46 24 4
gpt4 key购买 nike

在java代码中,我有 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));并使用 java.util.date 与数据库中的日期值进行交互。

Mysql数据库位于eu-west,字段定义为“datetime”(也尝试过时间戳)

我正在使用 JpaRepository 与数据库交互。

当我保留日期值(例如“Tue Dec 24 22:19:37 UTC 2019”)时,它会正确保存。但是,当我检索该值时,它显示为“Wed Dec 25 06:19:37 UTC 2019”,比原始值提前 8 小时。我还检查了它是否位于时区“UTC”

有什么建议吗?

最佳答案

I have TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

不要。

永远不要设置 JVM 当前的默认时区,除非作为某些问题的最后绝望解决方案。 do 会影响在该 JVM 中运行的所有应用程序的所有线程中的所有代码。这样做并不能解决你的问题。

and use java.util.date to interface with date value from database.

不要。

该类存在严重缺陷,现已成为遗留类,多年前已被 JSR 310 中定义的现代 java.time 类取代。

从 JDBC 4.2 及更高版本开始,使用 OffsetDateTime 表示时刻。

Mysql database is located in eu-west,

“eu-west”不是时区。仅使用proper time zone names格式为Continent/Region,例如Europe/Paris

and field is defined as "datetime" (also tried timestamp)

您是否在跟踪时间轴上的时刻或特定点?不要使用 DATETIME 作为列数据类型。该类型缺乏时区或与 UTC 的偏移量的概念。仅使用TIMESTAMP

我避开 JPA,我不能在那里帮助你吗?我可以显示简单的 JDBC 代码。

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

检索。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

如果您使用智能对象而不是愚蠢的字符串来遵循这种代码,那么您将不会遇到时区问题。

如果您选择其他路线,您可能会发现数据库之间存在各种工具,并且您的应用程序可能会隐式地将某些时区应用于从以下位置检索的时刻数据库。虽然本意是好的,但不幸的是,这些功能非常令人困惑并且适得其反。

关于mysql - 返回的日期值与数据库中存储的日期值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59473873/

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