目前我在使用Spring JPA时遇到了一个奇怪的问题:每当我尝试将一个日期映射为Date only时,它都会保存我想保存的那一天减去一天。例如:保存2月1日--> 我的数据库中有1月31日的日期。只要我使用DateTime,一切都可以。例子:MySQL时区设置为SystemSystem在UTC+1in连接URL,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
所以,尽管我只保存日期,它结束与错误的一天。有人知道为什么会发生这种情况吗?
添加。
如果我查看hibernate日志,问题似乎在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中的时区改成了EuropeLondon -->;一切都能正常工作。改为UTC或EuropeLondon-->;两者都不能正常工作!
spring.datasource.url = jdbc:mysql://localhost:3306/myDatabase?serverTimezone=Europe/Berlin&useLegacyDatetimeCode=false
非常感谢!
问候
约恩
你是否尝试过在spring yml中使用以下参数?
spring:
jpa:
properties:
hibernate.jdbc.time_zone: Europe/Berlin