1. 概要

私たちのアプリケーションのユーザーは、タイムスタンプに関しては要求が厳しい場合があります。 彼らは、アプリケーションがタイムゾーンを自動的に検出し、正しいタイムゾーンでタイムスタンプを表示することを期待しています。

このチュートリアルでは、JVMのタイムゾーンを変更するいくつかの方法を見ていきます。 また、タイムゾーンの管理に関連するいくつかの落とし穴についても学びます。

2. タイムゾーンの概要

デフォルトでは、JVMはオペレーティングシステムからタイムゾーン情報を読み取ります。 この情報はTimeZoneクラスに渡されます。このクラスは、タイムゾーンを保存し、夏時間を計算します

メソッドgetDefault、を呼び出すと、プログラムが実行されているタイムゾーンが返されます。 さらに、 TimeZone.getAvailableIDs()を使用して、アプリケーションからサポートされているタイムゾーンIDのリストを取得できます。

タイムゾーンに名前を付けるとき、Javaはtzデータベースの命名規則に依存します。

3. タイムゾーンの変更

このセクションでは、JVMのタイムゾーンを変更するいくつかの方法を見ていきます。

3.1. 環境変数の設定

まず、環境変数を使用してタイムゾーンを変更する方法を見てみましょう。 環境変数TZ。を追加または変更できます

たとえば、Linuxベースの環境では、exportコマンドを使用できます。

export TZ="America/Sao_Paulo"

環境変数を設定すると、実行中のアプリケーションのタイムゾーンが America / Sao_Paulo:になっていることがわかります。

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("America/Sao_Paulo"));

3.2. JVM引数の設定

環境変数を設定する代わりに、JVM引数user.timezoneを設定することもできます。このJVM引数は、環境変数TZよりも優先されます。

たとえば、アプリケーションを実行するときにフラグ-Dを使用できます。

java -Duser.timezone="Asia/Kolkata" com.company.Main

同様に、アプリケーションからJVM引数を設定することもできます

System.setProperty("user.timezone", "Asia/Kolkata");

これで、タイムゾーンがアジア/コルカタであることがわかります。

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Asia/Kolkata"));

3.3. アプリケーションからのタイムゾーンの設定

最後に、TimeZoneクラスを使用して、アプリケーションからJVMタイムゾーンを変更することもできます。 このアプローチは、環境変数とJVM引数の両方よりも優先されます。

デフォルトのタイムゾーンの設定は簡単です。

TimeZone.setDefault(TimeZone.getTimeZone("Portugal"));

予想どおり、タイムゾーンはポルトガルになりました。

Calendar calendar = Calendar.getInstance();
assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Portugal"));

4. 落とし穴

4.1. 3文字のタイムゾーンIDを使用する

3文字のIDを使用してタイムゾーンを表すことは可能ですが、推奨されていません

3文字のIDがあいまいなため、代わりに長い名前を使用する必要があります。たとえば、ISTはインド標準時、アイルランド標準時、イスラエル標準時のいずれかになります。

4.2. 全体設定

上記の各アプローチは、アプリケーション全体のタイムゾーンをグローバルに設定していることに注意してください。 ただし、最近のアプリケーションでは、タイムゾーンの設定はそれよりも微妙な違いがあります。

たとえば、おそらく時間をエンドユーザーのタイムゾーンに変換する必要があるため、グローバルタイムゾーンはあまり意味がありません。 グローバルタイムゾーンが必要ない場合は、各日時インスタンスでタイムゾーンを直接指定することを検討してください。 ZonedDateTimeまたはOffsetDateTimeは、このための便利なクラスです。

5. 結論

このチュートリアルでは、JVMのタイムゾーンを変更するいくつかの方法について説明しました。 システム全体の環境変数を設定するか、JVM引数を変更するか、アプリケーションからプログラムで変更できることがわかりました。

いつものように、この記事で使用されているすべての例は、GitHubで入手できます。