在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”下
有什么建议吗?
答案 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 ) ;
如果您使用智能对象而不是哑字符串来遵循此类代码,则时区将没有问题。
如果您走其他路线,您可能会在数据库之间找到各种工具,并且您的应用可能会隐式地将某个时区应用于从中检索到的时刻 数据库。尽管这些功能意图很好,但不幸的是,它们非常令人困惑并产生了影响。