【发布时间】:2018-09-17 08:38:51
【问题描述】:
我正在进行一些测试以将 UTC 定义为我的应用程序的默认时区。首先,我希望我的日期时间值与 UTC 值一起存储。
根据 VLAD MIHALCEA (https://vladmihalcea.com/how-to-store-date-time-and-timestamps-in-utc-time-zone-with-jdbc-and-hibernate/) 和 https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/ 我已在属性文件中设置:
spring.jpa.properties.hibernate.jdbc.time_zone= UTC
为了测试我使用的是 h2 数据库,我创建了一个包含所有 java 8 dateTime 类型的示例实体。
在我的 liquibase 配置中,它们的定义如下:
<column name="instant" type="timestamp"/>
<column name="local_date" type="date"/>
<column name="local_time" type="time"/>
<column name="offset_time" type="time"/>
<column name="local_date_time" type="timestamp"/>
<column name="offset_date_time" type="timestamp"/>
<column name="zoned_date_time" type="timestamp"/>
我认为我对每个字段都使用了好的类型。它适用于除“local_time”“offset_time”之外的所有字段,它们是时间 sql 类型而不是时间戳。
如您所见,我在上午 8:39(巴黎 GMT+2)添加了这一行,并且时间戳具有良好的 UTC 值(上午 6:38)。 但是“local_time”和“offset_time”都有一个奇怪的值(早上 7:39)。
我想知道为什么会出现这种行为,如果你们中的一些人知道为什么我的两个时间字段没有正确存储值。
PS:版本:
- 休眠:5.2.17.Final
- 春季启动:2.0.4.RELEASE
我的示例实体用于插入数据:
import javax.persistence.*;
import java.io.Serializable;
import java.time.*;
import java.util.Objects;
@Entity
@Table(name = "avdev_myData")
public class MyData implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "instant")
private Instant instant;
@Column(name = "local_date")
private LocalDate localDate;
@Column(name = "local_time")
private LocalTime localTime;
@Column(name = "offset_time")
private OffsetTime offsetTime;
@Column(name = "local_date_time")
private LocalDateTime localDateTime;
@Column(name = "offset_date_time")
private OffsetDateTime offsetDateTime;
@Column(name = "zoned_date_time")
private ZonedDateTime zonedDateTime;
【问题讨论】:
-
jpa.properties.hibernate.jdbc.time_zone= UTC必须是spring.jpa.properties.hibernate.jdbc.time_zone= UTC。否则它不会被映射。还有你是如何插入这些数据的? -
我的错。我正确设置了“spring.jpa.properties.hibernate.jdbc.time_zone”。我使用“MyData”实体通过休息调用和弹簧数据存储库插入数据
-
请修复该属性并添加一些代码并说明您使用的是哪些类型(Joda Time 或 JDK8)。
-
你说得对,我必须添加我的实体才能更清晰。正如我在文章开头所说的,我只使用 JDK8 Time API。我想测试所有 JDK8 类型以确保它们可以使用 UTC 配置选项正确处理。
标签: java spring hibernate datetime spring-boot