Java SpringBoot JPA时间存储在本地时区的MySQL中

Java SpringBoot JPA时间存储在本地时区的MySQL中,java,mysql,datetime,jpa,spring-boot,Java,Mysql,Datetime,Jpa,Spring Boot,我写了一个类似这样的类 @Entity class Employee { @Column private String name; @Column private Date joinedDate; } 现在,我通过执行newdate()为JoineDate赋值。当我打印这个日期时,java会将时区修正添加到这个日期中。但Java将在内部存储自epoch以来的时间,而不带时区。假设当地日期为2017年11月29日星期三18:43:43 当我将

我写了一个类似这样的类

@Entity
class Employee {

      @Column
      private String name;

      @Column
      private Date joinedDate;

}
现在,我通过执行
newdate()
为JoineDate赋值。当我打印这个日期时,java会将时区修正添加到这个日期中。但Java将在内部存储自epoch以来的时间,而不带时区。假设当地日期为2017年11月29日星期三18:43:43

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

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

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


如何实现这一点?

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


您可以在此页面中查看示例:

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

创建具有不同时区的日期实例 Obs:您的观察是对的,从历元开始的毫秒没有时区,但您在数据库中使用的是日期,然后它就有了


更新


我发现,它承诺只改变hibernate jdbc字符集

谢谢@NeoMortem的回答。我不想用区域存储datetime,而是想摆脱时区,用UTC存储日期。我知道在mysql中,时间戳内部是用UTC而不是时区保存的,但您必须设置全局配置变量或会话变量,设置全局时区=“+00:00”;;
java -Duser.timezone=Europe/Sofia com.acme.Main
Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTime()
Date convertedDatetime = Date.from(datetime.atZone(ZoneId.off("UTC").toInstant());