【Java・SpringBoot】eclipse(STS)で起動するサーバーのタイムゾーンを変更する方法(JST->UTC)

どうも今回はSpringbootにて
サーバの起動時の基準時刻を固定で変更する方法を記載します。

※ここでは日本で、なおかつタイムゾーンの設定をしなかったPCを使用して
※調査したことを前提としています。

起きたこと

先日仕事をしていたら、以下のような問題が発生してしまいました。

とあるサーバで動いてる処理の話。
日時を取得して表示する処理にて
実際に処理を行なった時刻を表示させたかったのだが
実行した時間の-9時間で表示されてしまっていた。

原因調査するために自PCの環境で調査

自分のPCに入っている開発環境で調査を行なったところ
実際に処理を行なった時間が取れていた。
想定通りの動きをしていたためローカル環境上では問題はなかった。

つまりは

サーバで取得した時間:処理を行なった時間-9時間(15:00に処理を行なったら6:00)
ローカルで取得した時間:処理を行なった時間(15:00に処理を行なったら15:00)

違いが出てしまった原因

原因は主に3つ
1.サーバの起動する時に使っている時間基準がUTC(GMT)になっていたこと
2.ローカル環境を起動する時に使っている基準時間が無設定だったこと
(無設定の場合はOSのタイムゾーンの設定に依存する、何も設定してなければJST(Asia/Tokyo)になるはず。。)
3.今回使った日時用のクラスがDateクラス(java.utilパッケージ)をそのまま使っていたこと

つまりは
・サーバの起動時のタイムゾーンが、環境によって異なっていた
・Dateクラスは、実際に動いているサーバの時間に依存する時刻を取得することを忘れていた・・・

実際に開発を行うときは、実際に動く環境を想定した環境作りが大切

本当に当たり前のことです。至極当然、全くもってその通り、、、Exactly!!
なので、起動時のサーバのタイムゾーンを変更するための設定をします。

・自分が使用しているPCのタイムゾーン設定をサーバと同じにする
(手っ取り早いけどあまりオススメはしないので今回は省略)

・設定ファイルを修正する方法

・eclipse(STS)のBootダッシュボードから起動構成を設定する方法
(つまりはサーバの起動構成の設定)

設定ファイルを修正する方法

ここのサイトが比較的わかりやすかったです。

設定ファイルなんかねーぞ!
設定ファイルはあるけど、みんなで共有するものだし、
一旦自分のローカルだけで見てみたい!
という方は↓↓↓↓↓になります。

eclipse(STS)のBootダッシュボードから起動構成を設定する方法

以下の手順で実行すればローカル環境のタイムゾーンの設定が行えます。

1.Bootダッシュボードのサーバを選んで右クリック->構成を開くをクリック

2.実行構成(デバッグで開いた場合はデバッグ構成)の「引数タブ」をクリック

3.VM引数に「-Duser.timezone=UTC」を追加
修正前

修正後

4.適用ボタンを押す

コードを実行した場合の修正前後比較

実際に動かした時間:0:50分頃

Java

package com.example.controller;

import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserInfoController {

	@RequestMapping(value="/")
	public String index(Model model) {
		// new Date()しているのでサーバに依存した日時が取得できる
		model.addAttribute("time",new Date());
		return "main/index";
	}
}

HTML

<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>タイトル</title>
  </head>
  <body>
  <p th:text="ただいまの時刻は"></p>
  <div th:text="${time}">
  </div>
  </body>
</html>

・修正前(JST取得)で表示した場合
————————————

————————————

・修正前(UTC取得)で表示した場合
————————————

————————————

できました。
「UTC」としているところを「JST」にすれば
JSTで時刻が取得できます。
※どうやら今は「Asia/Tokyo」という書き方で取るのが普通らしいです
※三文字で指定するのは推奨していないとか・・・それはまた別の機会に・・・

まとめ

日時を扱うプロジェクトというのはほとんどだと思いますが、
サーバの基準時刻まで明確に指定いるところはどれだけいるのかは正直わかっていません。
ただ、ローカルの開発環境で動作確認して、すぐにチェックできるように、サーバとほぼ同じ状態にすることは
作業効率を考えた上でも、Mustになるのではないかなと思いました。

今回は以上!

スポンサーリンク