Spring Boot設定を使用してMySQL JDBCタイムゾーンを設定する

1. 概要

時々、MySQLに日付を保存するときに、データベースの日付がシステムまたはJVMとは異なることに気付きます。
また、別のタイムゾーンでアプリを実行する必要がある場合もあります。
このチュートリアルでは、Spring Boot設定を使用してMySQLのタイムゾーンを変更するさまざまな方法を紹介します*。

2. URLパラメータとしてのタイムゾーン

タイムゾーンを指定する1つの方法は、接続URL文字列にパラメーターとして含めることです。
デフォルトでは、MySQLは__useLegacyDatetimeCode = trueを使用します。 __タイムゾーンを選択するには、このプロパティを_false_に変更する必要があります。 そしてもちろん、プロパティ_serverTimezone_を追加してタイムゾーンを指定します:
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useLegacyDatetimeCode=false
    username: root
    password:
もちろん、代わりにlink:/spring-boot-configure-data-source-programmatic[Java構成でデータソースを構成]することもできます。
このプロパティやその他の詳細については、https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html [MySQL公式ドキュメント]にあります。

3. スプリングブートプロパティ

または、_serverTimezone_ URLパラメーターでタイムゾーンを示す代わりに、Spring Boot構成で_time_zone_プロパティを指定できます。
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
またはYAMLの場合:
spring:
  jpa:
    properties:
      hibernate:
        jdbc:
          time_zone: UTC
ただし、**以前に見たように、** URLに_useLegacyDatetimeCode = false_を追加する必要がまだあります**。

4. JVMデフォルトタイムゾーン

そしてもちろん、Javaのデフォルトのタイムゾーンを更新できます。
繰り返しますが、以前のように** URLに_useLegacyDatetimeCode = false_を追加します**。 そして、単純なメソッドを追加するだけです。
@PostConstruct
void started() {
  TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
しかし、*このソリューションは、アプリケーション全体にわたるため、他の問題を生成する可能性があります。*アプリケーションの他の部分は、別のタイムゾーンを必要とする可能性があります。 たとえば、異なるデータベースに接続する必要がある場合があり、何らかの理由で、異なるタイムゾーンに日付を保存する必要があります。

5. 結論

このチュートリアルでは、SpringでMySQL JDBCタイムゾーンを設定するいくつかの異なる方法を見ました。 URLパラメータ、プロパティ、およびJVMのデフォルトのタイムゾーンを変更することでそれを行いました。
いつものように、サンプルの完全なセットはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-boot-mysql[over on GitHub]です。