本地时区存储在 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 时区设置