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