mysql - 带有 MySql DB 的 Spring Boot JPA - 映射日期以错误的日期结束(休息 1 天)
问题描述
目前我在使用 Spring JPA 时遇到了一个奇怪的问题:每当我尝试将日期映射为仅日期时,它会将我想要保存的日期减去 1 天。例如,保存 2 月 1 日 --> 我的数据库中有 1 月 31 日。只要我使用 DateTime,一切正常。示例:MySQL 时区设置为 System System 在连接 URL 中为 UTC + 1,serverTimeZone 设置为 UTC 并且 useLegacyDatetimeCode = true
@Entity
public class ZoneEntity
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@CreationTimestamp
private LocalDateTime createDateTime;
@CreationTimestamp
private LocalDate createDate;
@Temporal(value = TemporalType.TIMESTAMP)
private Date temporalDate;
private LocalDateTime localDateTime;
private LocalDate localDate;
@Column(columnDefinition = "DATE")
private LocalDate localDateWithColumn;
public ZoneEntity() {
temporalDate = new Date();
localDateTime = LocalDateTime.now();
localDate = LocalDate.now();
localDateWithColumn = LocalDate.now();
}
然后我将像这样保存一个新实体:
service.save(new ZoneEntity());
如果我今天(24.02.2020)执行此操作,我将得到以下结果
createDateTime : 24.02.2020 15:20:00 --> Correct (UTC)
createDate : 23.02.2020 --> day - -1
temporalDate : 24.02.2020 15:20:00 --> Correct (UTC)
localDate : 23.02.2020 --> day - 1
localDateTime : 24.02.2020 15:20:00 --> Correct (UTC)
localDateWithColumn : 23.02.2020 --> day - 1
所以不管我只保存日期,它以错误的日期结束。有人知道为什么会这样吗?
添加:
如果我查看休眠日志,问题似乎出在 MySQL 方面......
Hibernate:
insert
into
zone_entity
(create_date, create_date_time, local_date, local_date_time, local_date_with_column, temporal_date, id)
values
(?, ?, ?, ?, ?, ?, ?)
2020-02-24 16:42:25.371 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.374 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [TIMESTAMP] - [2020-02-24T16:42:25.365036900]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [TIMESTAMP] - [2020-02-24T16:42:25.302181]
2020-02-24 16:42:25.375 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [DATE] - [2020-02-24]
2020-02-24 16:42:25.376 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as [TIMESTAMP] - [Mon Feb 24 16:42:25 CET 2020]
2020-02-24 16:42:25.376 TRACE 19628 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [7] as [BIGINT] - [294]
补充:如果我尝试通过 MySQL 工作台插入以下值(如 Hibernate 中的参数所示),一切正常(省略时间戳以使其更短)。
insert
into
zone_entity
(create_date, create_date_time, local_date, local_date_time, local_date_with_column,id)
values
('2020-02-24', '2020-02-24T22:03:13.842324', '2020-02-24', '2020-02-24T22:03:13.842324', '2020-02-24',99);
补充:我现在将 DB URL 中的时区更改为 Europe/London --> 一切正常。更改为 UTC 或欧洲/伦敦 --> 两者都不起作用!
spring.datasource.url = jdbc:mysql://localhost:3306/myDatabase?serverTimezone=Europe/Berlin&useLegacyDatetimeCode=false
提前谢谢了 !
亲切的问候
乔恩
解决方案
您是否尝试过在 spring yml 中使用以下参数?
spring:
jpa:
properties:
hibernate.jdbc.time_zone: Europe/Berlin
推荐阅读
- c# - 如何使用 LINQ 从多级变量中获取值
- c++ - 我的应用程序因 ucrtbase.dll 而崩溃。这是什么意思?我应该在哪里查找代码中的错误?
- android - 如何在 Kotlin 中对片段使用 setUserVisibleHint
- mysql - 如何使用 MySQL 从复杂查询中获取条目的位置?
- angular - 使用 forroot 导入的角度第三方模块
- python - 重命名文件在几个地方缺少下划线
- algorithm - 如何找到使字符串平衡的最小操作数?
- python-3.x - Python在函数中打印随机数
- html - 图像不在较大的卡片 div 中居中
- javascript - 在另一个函数中调用动态函数