JVMタイムゾーンを設定する方法

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で入手できます。