【问题标题】:Spring JPA java.util.Date to Mysql timestamp with wrong date valueSpring JPA java.util.Date 到 Mysql 时间戳,日期值错误
【发布时间】:2017-12-04 13:19:39
【问题描述】:

我有一个带有日期字段的 JPA 实体被持久化到 Mysql DateTime 中。

字段:

  @Column(name = "CREATION_DATE")
  private Date creationDate;

列:
CREATION_DATE datetime DEFAULT NULL,

二传手:

request.setCreationDate(new Date());//Value set to current date

我收到一个奇怪的错误,即持续日期比当前时间少 8 小时。尝试了以下几种方法:

  1. 在字段中使用@Temporal(TemporalType.TIMESTAMP)

  2. 设置默认时区
    TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

  3. 打印设置前的日期,显示正确的值。

  4. 在 mysql 层也设置时区:
    SET GLOBAL time_zone = '+8:00'; SET SESSION time_zone = '+8:00';

  5. 将字段类型更改为java.sql.Timestamp

上述方法都没有帮助。有人有类似的问题吗?有什么线索吗?

【问题讨论】:

  • 您是否在云环境中部署了代码?
  • 它部署在rehl裸机服务器中。
  • 我想知道 JPA 提供者的日志是怎么说的?你看过不是吗? ...
  • 没试过打印sql和参数值。我会尝试启用它。这个问题没有发生在我在 oracle jdk 中运行的开发机器中,仅在运行 openjdk 的服务器中发生。 oracle和open jdk在这方面有什么区别吗?
  • 我尝试打印休眠日志时间戳是正确的

标签: java mysql jpa


【解决方案1】:

找到问题了,问题出在jdbc连接URL上。

spring.datasource.url=jdbc:mysql://:3307/dbname?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

由于 URL 中的服务器时区设置,GMT+8 时间被转换为 UTC,这导致了 8 小时的时差。删除 URL 中的 serverTimezone 参数后,日期工作正常。感谢 Neil 和 Shazin 的时间和支持。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多