Я делаю несколько тестов, чтобы определить 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, я создал образец сущности со всем типом dateTime java 8.
В моей конфигурации 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», которые являются типами Time sql, а не timestamp.
Как вы можете видеть, я добавил эту строку в 8:39 (Парижское время по Гринвичу + 2), и временные метки имеют хорошее значение UTC (6:38 утра). НО "local_time" и "offset_time"имеют странное значение (7:39 утра).
Интересно, почему такое поведение, если у некоторых из вас есть идея, почему мои два поля времени не хранят значения правильно.
PS: версия:
- Спящий режим: 5.2.17. Финал
- Пружинная загрузка: 2.0.4.RELEASE
Мой образец RuВремя использования для вставки данных:
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;