it-swarm.com.ru

hibernate + весенняя дата загрузки магазина при проблемах с часовым поясом UTC

Я делаю несколько тестов, чтобы определить 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», которые являются типами Time sql, а не timestamp.

 enter image description here

Как вы можете видеть, я добавил эту строку в 8:39 (Парижское время по Гринвичу + 2), и временные метки имеют хорошее значение UTC (6:38) НО и local_time, и offset_time имеют странное значение (7: 39am).

Интересно, почему такое поведение, если у некоторых из вас есть идея, почему мои два временных поля не хранят значения правильно.

PS: версия:

  • Hibernate: 5.2.17. Окончательный
  • Весенняя загрузка: 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;
3
Avdev4j

Я открыл проблему в спящем баг-трекере и получил ответ на мою проблему.

Для LocalTime трансформация относится к 1 января 1970 года, а не к тому дню, когда я проводил тест. Таким образом, DST не обрабатывается.

По словам Влада Михальча, вместо этого мы должны использовать LocalDateTime, потому что мы знаем дату и, конечно же, она находится на периоде летнего времени или нет.

здесь есть весь ответ: https://hibernate.atlassian.net/browse/HHH-12988?focusedCommentId=103750&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment- 103750

с уважением

1
Avdev4j

Попробуй:

@SpringBootApplication
public class YourApplication {

    @PostConstruct
    void started() {
        // set JVM timezone as UTC
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}
1
Bendy Zhang

В случае, если вы решите использовать MySQL, в моем случае

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL57InnoDBDialect

spring.datasource.url = JDBC: MySQL: // DBHost: 3306/DBNAME useLegacyDatetimeCode = ложь и serverTimezone = UTC

0
Petko Mirchev