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

时间:2019-12-24 22:32:43

标签: mysql date datetime jpa java.util.date

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

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  

我有TimeZone.setDefault(TimeZone.getTimeZone(“ UTC”));

不要。

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

  

并使用java.util.date与数据库中的日期值进行交互。

不要。

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

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

  

Mysql数据库位于eu-west

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

  

并且该字段定义为“ datetime”(也尝试使用时间戳记)

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

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

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

检索。

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

如果您使用智能对象而不是哑字符串来遵循此类代码,则时区将没有问题。

如果您走其他路线,您可能会在数据库之间找到各种工具,并且您的应用可能会隐式地将某个时区应用于从中检索到的时刻 数据库。尽管这些功能意图很好,但不幸的是,它们非常令人困惑并产生了影响。