久しぶりにSpringbootとThymeleafでWebアプリケーションを作ってみたんですが、GCPに乗せたら日付がずれてうまく動かなかったので、これも備忘録にしておきます。
症状は日付と時間がズレる
ローカルの開発環境では問題なく動作していたWebアプリケーションですが、クラウド上にデプロイすると日付がズレてしまいました。
日付や時間がズレる場合は、だいたいタイムゾーンの設定のどこかに問題があります。
Webアプリのタイムゾーンを確認
Webアプリ起動時のタイムゾーンで東京を指定をしています。
-Duser.timezone=Asia/Tokyo
データベース(MySQL)の現在のタイムゾーンを確認
Javaアプリ側のタイムゾーンが東京でしたので、データベースのタイムゾーンも同じにする必要があります。
MySQLのタイムゾーンを確認すると、「SYSTEM」になっています。
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
mysql>
サーバーの現在のタイムゾーン。
MySQLリファレスンスより引用 https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.htmltime_zone
グローバルシステム変数は、サーバーが現在動作しているタイムゾーンを示します。time_zone
の初期値は'SYSTEM'
であり、これはサーバーのタイムゾーンがシステムタイムゾーンと同じであることを示します。
今回はGCPのCloudSQLのMySQLを採用。
東京リージョンに作ったので、デフォルトのSYSTEMの場合はリージョンのタイムゾーンが適用されると勝手に思っていたのですが、どうやら違うみたいです。
念の為、本当に時間がズレているかデータベースの現在時刻を確認してみましたが、9時間ズレていました。(現在18時)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-08-12 09:45:39 |
+---------------------+
1 row in set (0.01 sec)
mysql>
CloudSQL (MySQL) のタイムゾーン変更
今回は直接データベースを覗くこともある都合上、日本時間で記録しておきたいので、データベースのタイムゾーンを日本時間に変更することでWebアプリ側と一致させます。
そんなわけで、データベース(MySQL)のタイムゾーンを変更します。GCPのCloudSQLの場合は、my.cnfを直接変更できないため、GCPの管理画面から操作します。
CloudSQL画面を開く
左側のメニューから「SQL」を選択します。
「編集」をクリックして、フラグのセクションで新しくデータベースのフラグを追加します。
①フラグ選択プルダウンで、default_time_zone を選択します。
②日本時間にする場合は、標準時刻との差である9時間を指定します。「+09:00」
フラグで時間差の設定ができたら、保存します。
設定を有効にするためには再起動が必要です。接続中のコネクションは切断されてしまいますので、注意してください。
設定変更結果を確認
タイムゾーンの変更が終わったら、確認しましょう。
タイムゾーンが+9:00されています。
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC |
| time_zone | +09:00 |
+------------------+--------+
2 rows in set (0.00 sec)
mysql>
データベースの日時も正しい時間になりました。Webアプリでもズレずに表示できました。
mysql>
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-08-12 18:50:36 |
+---------------------+
1 row in set (0.01 sec)
mysql>
ではまた~
コメント