首页 > 解决方案 > Spring JPA MYSQL 日期减一天

问题描述

我正在使用一个使用 JPA 连接到本地 MySQL 数据库的 spring boot 项目。我有一个表,其中有一DATE列在 JPA 模型类中被镜像private Date myDate;为类型java.sql.Date;。当我在页面上显示项目中的记录时,日期晚了一天(例如,如果是 2021-01-25,则页面显示 2021-01-24)并且当我通过项目更新或添加记录时,新选择的日期也比我选择的日期晚一天。我试图添加spring.jpa.properties.hibernate.jdbc.time_zone : CET,但这没有任何效果。我${record.myDate}在页面和表单上显示这样的记录:

<fieldset>
   <form:label path="myDate">Date *</form:label>
   <form:input path="myDate" type="date" required="required" class="form-control"/>
   <form:errors path="myDate" cssClass="text-warning" />
</fieldset>

标签: javamysqlspringspring-boothibernate

解决方案


MySQL 文档说:

MySQL 将 TIMESTAMP 存储在 UTC 值中。但是,MySQL 按原样存储 DATETIME 值,而没有时区。

因此,似乎当您通过 JPA 从数据库中检索数据值时,它被分配的时区不是您所期望的(可能是执行代码的上下文中的默认时区 - 您的应用程序服务器)。

我认为要使其正常工作,您可能需要TIMESTAMP在 MySQL 中使用列而不是DATETIME.

进行更改后,您可能还应该使用LocalDateTime而不是Date. JPA 支持 LocalDateTime - 使用以下列定义:

@Column(name = "my_date_time", columnDefinition = "TIMESTAMP")
private LocalDateTime myDateTime;

推荐阅读