Spring Bootで実装を進めていたところ、Date型の値が想定値-9時間となってしまいました。
その際に確認&対応したことのまとめです。
環境
- OS:Windows10
- IDE:Eclipse2020-03
- Java:11
- MySQL:5.7
- Spring Boot:2.3.2
前提事項
- 日本標準時に設定するものとします。
確認内容
1. DBのタイムゾーンの設定確認
対象の値がDB由来の場合は、まず、DBの設定が正しくできているか確認しましょう。
以下ように、show variablesコマンドを実行します。
> show variables like '%time_zone%';
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
+------------------+------------+
日本標準時の場合は、time_zoneがAsia/Tokyoに設定されているはずです。
(defaultの場合は、system_time_zoneの値が参照されます。)
異なっている場合は設定ファイルmy.cnfの内容を以下のように変更しましょう。
[mysqld]
default-time-zone = 'Asia/Tokyo'
設定が完了したら、以下のコマンドを実行して、日本標準時で現在時刻が取得できることを確認します。
select now();
2. アプリケーションサーバーのタイムゾーンの設定確認
対象の値がDB由来でない場合、もしくは、DBの設定に問題がなかった場合はアプリケーションサーバーのタイムゾーンを確認しましょう。
一番手っ取り早い方法は例えば以下のようなコードを追記し、コンソールにサーバーの現在時刻を出力させる方法です。
System.out.println("現在の時刻は" + new Date() + "です。");
上記によって、想定の結果が得られない場合は、環境変数への設定を行います。
(1) Eclipseを使ってプロジェクト起動する場合
以下の手順でサーバーのタイムゾーンを設定します。
① Eclipseのメニューバーにて、「実行」(①) > 「実行構成」(②)を選択。
② Spring Boot アプリケーションの対象のアプリを選択し(①)、引数タブにて(②)VM引数欄に「-Duser.timezone=JST」と記載し(③)、「適用」を押下(④)
(2) サーバー上で起動する場合
jarファイルと同じ階層に、「jarファイルの名前.conf」という名前で設定ファイルを作成し、設定内容を記述。
jarファイルの名前がhoge.jarの場合は以下の通り。
JAVA_OPTS="-Duser.timezone=Asia/Tokyo";
設定が完了したら、再起動して、時間が正しく設定されているか確認しましょう。
3. アプリケーションプロパティーファイルのJackson時刻設定の確認
上記1, 2でも想定の結果が得られなかった場合はアプリケーションプロパティーファイルに以下の記述を追加してみましょう。
spring:
jackson:
dateFormat: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Tokyo
dateFormatの部分は任意。
表示させたい形式を記述します。
余談ですが、ソースコードで個別に形式変更することも可能!
例えば以下のように記述すると、「yyyy/MM/dd」形式になります。
@JsonFormat(pattern = "yyyy/MM/dd")
private Date createdAt;
終わりに
最初何が原因で時間がズレてるのかわからず、とても困惑しました。
順番に確認することで原因までたどりつけました!
他にも時間がズレる要素ありましたら、ぜひ教えてください!
参考
1. DBのタイムゾーンの設定確認
2. アプリケーションサーバーのタイムゾーンの設定確認
- Java 日付型のタイムゾーンがGMT(-9時間)になってしまう不具合の解決方法 - Date, Calendar | ホームページ制作のサカエン
- 【Java・SpringBoot】eclipse(STS)で起動するサーバーのタイムゾーンを変更する方法(JST->UTC)| 地方に引越し予定の30歳男がプログラマーを続けるためのブログ
- Spring Bootで作ったWebアプリの時刻がイギリス時刻になった時は... | jildin workers
- Tomcatのタイムゾーン設定(Eclipse) | ゆるふわエンジニアのブログ