web-dev-qa-db-ja.com

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 dateTimeTypeを持つサンプルエンティティを作成しました。

私の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"/>

私はすべての分野に良いタイプを使用していると思います。タイムスタンプではなく時間SQLタイプである「local_time」「offset_time」を除くすべてのフィールドで機能します。

enter image description here

ご覧のとおり、この行を午前8時39分(パリGMT + 2)に追加し、タイムスタンプのUTC値は適切です(午前6時38分)。しかし、「local_time」と「offset_time」の両方に奇妙な値があります(7:39 am)。

私の2つの時間フィールドが値を正しく格納しない理由を知っている人がいるのなら、なぜこの動作なのか疑問に思います。

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の場合、変換は1970年1月1日を基準にしており、テストを実行した日ではありません。したがって、DSTは処理されません。

Vlad Mihalceaによると、日付がわかっているため、代わりにLocalDateTimeを使用する必要があります。もちろん、DST期間であるかどうかもわかります。

ここに全体の応答があります: https://hibernate.atlassian.net/browse/HHH-12988?focusedCommentId=103750&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-10375

よろしく

1
Avdev4j

試してみてください:

@SpringBootApplication
public class YourApplication {

    @PostConstruct
    void started() {
        // set JVM timezone as UTC
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}
4
Bendy Zhang
spring.datasource.url=jdbc:mysql://...?serverTimezone=Asia/Shanghai

私のために働きます。

  1. 休止状態は、mysqlのタイムゾーンを反映する必要があります。
  2. mysqljdbcはmysqlタイムゾーンを反映する必要があります。
1
softwarevamp

私の場合、MySQLを使用することを決定した場合は、

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

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

1
Petko Mirchev

Springコンテキストが初期化されると..。

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
Tiago Medici