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

Returned date value is not same as stored in database

在 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 的当前默认时区,除非作为某些问题的最后绝望解决方案。这样做会影响该 JVM 中所有应用程序 运行 中所有线程中的所有代码。这样做并不能解决您的问题。

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

不要。

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

从 JDBC 4.2 开始,使用 OffsetDateTime 表示一个时刻。

Mysql database is located in eu-west,

“eu-west”不是时区。在 Continent/Region 格式中仅使用 proper time zone names,例如 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 ) ;

如果您遵循使用智能对象而不是哑字符串的此类代码,您将不会遇到时区问题。

如果你走其他路线,你可能会发现数据库和你的应用程序之间的中间有各种工具可能会隐式地将一些时区应用到从中检索的时刻 数据库。虽然用意良好,但不幸的是,这些功能非常混乱且适得其反。