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

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

enter image description here

Как вы можете видеть, я добавил эту строку в 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;

Ответы [ 5 ]

0 голосов
/ 31 мая 2019

После инициализации контекста пружины ....

import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


@Component
public class ApplicationStartUp {

    @EventListener(ContextRefreshedEvent.class)
    public void contextRefreshedEvent() {

        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

    }   

}

OR

@Component
public class InitializingContextBean implements InitializingBean {

    private static final Logger LOG  = Logger.getLogger(InitializingContextBean.class);

    @Autowired
    private Environment environment;

    @Override
    public void afterPropertiesSet() throws Exception {         
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}
0 голосов
/ 31 мая 2019
spring.datasource.url=jdbc:mysql://...?serverTimezone=Asia/Shanghai

у меня работает.

  1. Hibernate ДОЛЖЕН отражать часовой пояс mysql.
  2. mysql jdbc должен отражать часовой пояс mysql.
0 голосов
/ 18 сентября 2018

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

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

spring.datasource.url = jdbc: mysql: // DBHOST: 3306 / DBNAME? useLegacyDatetimeCode = false & serverTimezone = UTC

0 голосов
/ 02 октября 2018

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

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

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

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

1010 * привет *

0 голосов
/ 17 сентября 2018

Попробуйте:

@SpringBootApplication
public class YourApplication {

    @PostConstruct
    void started() {
        // set JVM timezone as UTC
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...