java - 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>
解决方案
MySQL 文档说:
MySQL 将 TIMESTAMP 存储在 UTC 值中。但是,MySQL 按原样存储 DATETIME 值,而没有时区。
因此,似乎当您通过 JPA 从数据库中检索数据值时,它被分配的时区不是您所期望的(可能是执行代码的上下文中的默认时区 - 您的应用程序服务器)。
我认为要使其正常工作,您可能需要TIMESTAMP
在 MySQL 中使用列而不是DATETIME
.
进行更改后,您可能还应该使用LocalDateTime
而不是Date
. JPA 支持 LocalDateTime - 使用以下列定义:
@Column(name = "my_date_time", columnDefinition = "TIMESTAMP")
private LocalDateTime myDateTime;
推荐阅读
- python - PYNQ-Z1:如何使用基本覆盖将视频从 HDMI 输入流式传输到 HDMI 输出?
- ios - iOS:使“位置”出现在应用设置中而不请求位置授权(Tile 应用示例)
- javascript - 我可以使用 chrome 开发人员工具更新 android 应用程序的远程 javascript 文件吗?
- etl - 有什么方法可以合并行以在 Talend Open Studio 中填充空值?
- typescript - Visual Studio 2019 中 Jasmine 的无用测试失败消息
- asp.net-core - .NET CORE 3.1 仅适用于 Linux,不适用于 Windows?
- javascript - 避免以 JavaScript 方式重复
- nix - 为什么使用“runCommand”时需要源?
- android - Kotlin - 引起:java.util.UnknownFormatConversionException:转换='P'
- c - 过度考虑如何加载和编辑文件