アプリケーションのデフォルトのタイムゾーンとして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」を除くすべてのフィールドで機能します。
ご覧のとおり、この行を午前8時39分(パリGMT + 2)に追加し、タイムスタンプのUTC値は適切です(午前6時38分)。しかし、「local_time」と「offset_time」の両方に奇妙な値があります(7:39 am)。
私の2つの時間フィールドが値を正しく格納しない理由を知っている人がいるのなら、なぜこの動作なのか疑問に思います。
PS:バージョン:
私のサンプルエンティティはデータを挿入するために使用します:
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;
休止状態のバグトラッカーで問題を開き、問題の回答を得ました。
LocalTimeの場合、変換は1970年1月1日を基準にしており、テストを実行した日ではありません。したがって、DSTは処理されません。
Vlad Mihalceaによると、日付がわかっているため、代わりにLocalDateTimeを使用する必要があります。もちろん、DST期間であるかどうかもわかります。
よろしく
試してみてください:
@SpringBootApplication
public class YourApplication {
@PostConstruct
void started() {
// set JVM timezone as UTC
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
}
spring.datasource.url=jdbc:mysql://...?serverTimezone=Asia/Shanghai
私のために働きます。
私の場合、MySQLを使用することを決定した場合は、
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL57InnoDBDialect
spring.datasource.url = jdbc:mysql:// DBHOST:3306/DBNAME?useLegacyDatetimeCode = false&serverTimezone = UTC
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"));
}
}