So stellen Sie die JVM-Zeitzone ein

1. Übersicht

Die Benutzer unserer Anwendungen können hohe Anforderungen an Zeitstempel stellen. Sie erwarten von unseren Anwendungen, dass sie ihre Zeitzonen automatisch erkennen und Zeitstempel in der richtigen Zeitzone anzeigen.

In diesem Tutorial sehen wir uns verschiedene Möglichkeiten an, wie Sie die Zeitzone der JVM ändern können . Wir werden auch einige der Fallstricke kennenlernen, die mit der Verwaltung der Zeitzone verbunden sind.

2. Einführung in die Zeitzone

Standardmäßig liest die JVM Zeitzoneninformationen vom Betriebssystem. Diese Informationen werden an die TimeZone- Klasse übergeben, die die Zeitzone speichert und die Sommerzeit berechnet .

Wir können die Methode getDefault aufrufen, die die Zeitzone zurückgibt, in der das Programm ausgeführt wird. Darüber hinaus können wir mit TimeZone.getAvailableIDs () eine Liste der unterstützten Zeitzonen-IDs von der Anwendung abrufen .

Bei der Benennung der Zeitzone stützt sich Java auf die Namenskonvention der tz-Datenbank .

3. Ändern der Zeitzone

In diesem Abschnitt werden wir uns verschiedene Möglichkeiten ansehen, wie wir die Zeitzone in der JVM ändern können.

3.1. Festlegen einer Umgebungsvariablen

Beginnen wir damit, wie wir eine Umgebungsvariable verwenden können, um die Zeitzone zu ändern. Wir können eine Umgebungsvariable TZ hinzufügen oder ändern .

In Linux-basierten Umgebungen können wir beispielsweise den Befehl export verwenden :

export TZ="America/Sao_Paulo"

Nach dem Festlegen der Umgebungsvariablen können wir sehen, dass die Zeitzone unserer laufenden Anwendung jetzt America / Sao_Paulo ist:

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

3.2. Festlegen eines JVM-Arguments

Eine Alternative zum Festlegen einer Umgebungsvariablen ist das Festlegen des JVM-Arguments user.timezone . Dieses JVM-Argument hat Vorrang vor der Umgebungsvariablen TZ .

Zum Beispiel können wir das Flag -D verwenden, wenn wir unsere Anwendung ausführen:

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

Ebenso können wir das JVM-Argument in der Anwendung festlegen :

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

Wir können jetzt sehen, dass die Zeitzone Asien / Kolkata ist:

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

3.3. Festlegen der Zeitzone in der Anwendung

Schließlich können wir auch die JVM-Zeitzone in der Anwendung mithilfe der TimeZone- Klasse ändern . Dieser Ansatz hat Vorrang vor der Umgebungsvariablen und dem JVM-Argument.

Das Einstellen der Standardzeitzone ist einfach:

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

Wie erwartet ist die Zeitzone jetzt Portugal :

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

4. Fallstricke

4.1. Verwenden von Zeitzonen-IDs aus drei Buchstaben

Obwohl es möglich ist, dreistellige IDs zur Darstellung der Zeitzone zu verwenden, wird dies nicht empfohlen.

Stattdessen sollten wir die längeren Namen verwenden, da die aus drei Buchstaben bestehenden IDs nicht eindeutig sind. Zum Beispiel könnte IST entweder die indische Standardzeit, die irische Standardzeit oder die israelische Standardzeit sein.

4.2. Globale Einstellungen

Beachten Sie, dass bei jedem der oben genannten Ansätze die Zeitzone global für die gesamte Anwendung festgelegt wird. In modernen Anwendungen ist das Einstellen der Zeitzone jedoch häufig nuancierter.

Zum Beispiel müssen wir wahrscheinlich die Zeit in die Zeitzone des Endbenutzers übersetzen, sodass eine globale Zeitzone nicht viel Sinn macht. Wenn keine globale Zeitzone benötigt wird, sollten Sie die Zeitzone direkt in jeder Datums- / Uhrzeitinstanz angeben. Hierfür ist entweder ZonedDateTime oder OffsetDateTime eine praktische Klasse.

5. Schlussfolgerung

In diesem Tutorial haben wir verschiedene Möglichkeiten zum Ändern der Zeitzone der JVM erläutert. Wir haben gesehen, dass wir entweder eine systemweite Umgebungsvariable festlegen, ein JVM-Argument ändern oder es programmgesteuert in unserer Anwendung ändern können.

Wie üblich sind alle in diesem Artikel verwendeten Beispiele auf GitHub verfügbar.