本地时区存储在 MySQL 中的 Spring Boot JPA 时间

Posted

技术标签:

【中文标题】本地时区存储在 MySQL 中的 Spring Boot JPA 时间【英文标题】:SpringBoot JPA time stored in MySQL in local time zone 【发布时间】:2018-05-13 05:27:27 【问题描述】:

我写了一个类似这样的类

@Entity
class Employee 

      @Column
      private String name;

      @Column
      private Date joinedDate;


现在,我通过new Date() 为joinedDate 赋值。当我打印这个日期时,java 会添加时区更正。但是 Java 将在内部存储自纪元以来没有时区的时间。假设本地日期是Wed Nov 29 18:43:43 IST 2017

当我将此对象存储到数据库中时,我希望存储的是 GMT/UTC 零时区的时间。 (或者至少,存储自纪元以来的毫秒数)。但是存储的值是Nov 29 18:43:43

这是错误的值。因为它不存储 UTC 时间,也不存储时区。我希望在我的应用程序中,数据库日期应该存储在 UTC 时区中。

我想在读写时存储 UTC 值,而不是应用程序运行的时区。我的应用程序可能在不同的时区运行,但使用相同的数据库。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

我认为您必须使用可以存储纳秒精度和时区的 java 8 java.time.ZonedDateTime 的首选类型。还要确保在您的数据库中类型是 TIMESTAMP。

您可以在此页面查看示例:enter link description here

【讨论】:

感谢@NeoMortem 的回答。我不想用时区存储日期时间,而是想摆脱时区并将日期存储在 UTC 中。 我知道在mysql时间戳内部保存在UTC而不是时区,但是你必须设置全局配置变量或会话变量,SET GLOBAL time_zone = '+00:00'; ; dev.mysql.com/doc/refman/5.7/en/time-zone-support.html【参考方案2】:

默认情况下,java 使用机器时区作为日期和日历,如果你想更改它,那么你有以下选项

Change JVM timezone

java -Duser.timezone=Europe/Sofia com.acme.Main

创建具有不同时区的日期实例

Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime()

Use java.time api

Date convertedDatetime = Date.from(datetime.atZone(ZoneId.off("UTC").toInstant());

Obs:您的观察是正确的,自纪元以来的毫秒数没有时区,但您在数据库中使用日期,那么它确实如此。


更新

我找到了that answer,它承诺只改变hibernate jdbc charset

【讨论】:

以上是关于本地时区存储在 MySQL 中的 Spring Boot JPA 时间的主要内容,如果未能解决你的问题,请参考以下文章

处理存储中的时区?

如何根据 Big Query 中的 UTC 时间戳在 Data Studio 中显示本地时区的日期/时间

mysql-connector-java 6.0.X serverTimezone 时区设置

在 MySQL 中计算时区的偏移量

通过忽略时区将 JSON DateTime 对象解析为 JQuery 中的本地时间

在 MySQL 中存储时区偏移的数据类型/结构