この記事にはプロモーションが含まれていることがあります

SpringbootアプリをGCPで動かしたら日付がズレる

IT

久しぶりにSpringbootThymeleafでWebアプリケーションを作ってみたんですが、GCPに乗せたら日付がずれてうまく動かなかったので、これも備忘録にしておきます。

構成
  • GCPGCE上でWebアプリケーション実行
  • SprintbootJPAThymeleaf
  • RDBは、CloudSQLMySQL
スポンサーリンク

症状は日付と時間がズレる

ローカルの開発環境では問題なく動作していた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> 

サーバーの現在のタイムゾーン。time_zone グローバルシステム変数は、サーバーが現在動作しているタイムゾーンを示します。time_zone の初期値は 'SYSTEM' であり、これはサーバーのタイムゾーンがシステムタイムゾーンと同じであることを示します。

MySQLリファレスンスより引用 https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html

今回は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> 

ではまた~

コメント

タイトルとURLをコピーしました