So stellen Sie eine JVM-Zeitzone richtig ein

141

Ich versuche, ein Java-Programm auszuführen, aber es wird eine Standard-GMT-Zeitzone anstelle einer vom Betriebssystem definierten Zeitzone verwendet. Meine JDK-Version ist 1.5 und das Betriebssystem ist Windows Server Enterprise (2007)

In Windows ist eine zentrale Zeitzone angegeben, aber wenn ich das folgende Programm ausführe, erhalte ich eine GMT-Zeit.

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

Hier ist die Ausgabe

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

Bitte beachten Sie, dass ich die Zeitzone nicht in der Anwendung festlegen möchte. Ich möchte, dass die von JVM verwendete Zeitzone die im Betriebssystem angegebene ist. (Ich finde diese Probleme nicht bei anderen Servern mit Version 1.4 von JDK und Microsoft Server 2003).

Alle Gedanken wäre sehr dankbar.

Kushal Paudyal
quelle
1
Hm, das ist seltsam. Sieht aus wie ein JVM / OS-Fehler oder eine seltsame Fehlkonfiguration.
Michael Borgwardt
Wie rufst du die DateTestKlasse an?
Matt B
@matt b: Ich kompiliere und rufe DateTest über die Windows-Eingabeaufforderung auf. Dies ist jedoch nur eine Testklasse. Das ursprüngliche Problem war ein ETL-Prozess für IBM Cognos Server.
Kushal Paudyal
1
Ich wollte nur ausschließen, dass es über Shell- / Batch-Skripte gestartet wird, die möglicherweise einen -Duser.timezoneWert weitergeben
matt b

Antworten:

220

Sie können der JVM diesen Parameter übergeben

-Duser.timezone

Beispielsweise

-Duser.timezone=Europe/Sofia

und das sollte den Trick machen. Das Setzen der Umgebungsvariablen TZ reicht auch unter Linux aus.

Bozhidar Batsov
quelle
Wir mussten das JDK DST Timezone Update Tool - 1.3.25 (tzupdater) verwenden und dann den JVM-Parameter wie von Ihnen vorgeschlagen ändern, und wir konnten das Problem endlich beseitigen. Übrigens werden die Zeitzoneninformationen von Windows in einer Registrierung gespeichert. Der von mir verwendete Updater hat auch die Registrierungswerte aktualisiert.
Kushal Paudyal
1
Ich versuche, meine JVM mit diesem Parameter zu starten, scheint aber keine Änderung zu haben ... Wenn ich mit UTC starten möchte, was soll ich als Parameter verwenden?
Rafa.ferreira
In meiner Anwendung ändere ich einige Standorte und erhalte Zeitzonen dieser Standorte. Mit der Zeitzone verarbeite ich weiter. Aber wenn die Anwendung zum ersten Mal gestartet wird, erhalte ich korrekte Werte. Wenn ich die Zeitzone ändere und die neue Zeitzone als Standardzeitzone einstelle, erhalte ich nicht die richtigen Werte. Was ist das Problem? So ändern Sie die Zeitzone genau. Ich ändere die Zeitzone mit TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray
2
Eine Liste der Zeitzonen für TZ finden Sie hier: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Die Verwendung des Zeitzonennamens ist besser als der Versatz, da er die Sommerzeit unterstützt.
Brian
65

Sie können auch die Standardzeitzone in Ihrem Code festlegen, indem Sie den folgenden Code verwenden.

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

Zu dir

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
Ali786
quelle
1
"Bitte beachten Sie, dass ich die Zeitzone nicht in der Anwendung festlegen möchte."
AbVog
22

Die akzeptierte Antwort oben:

-Duser.timezone="Europe/Sofia" 

Hat bei mir nicht genau funktioniert. Ich konnte meine Zeitzone nur erfolgreich ändern, wenn ich keine Anführungszeichen für die Parameter hatte:

-Duser.timezone=Europe/Sofia
WN4yhihiY
quelle
2
Genau. Ich habe die ursprüngliche Antwort bearbeitet, um die Anführungszeichen zu entfernen.
GaZ
1
Dies hängt von der verwendeten Shell ab.
Vadipp
10

Unter Windows 7 und für JDK6 musste ich -Duser.timezone="Europe/Sofia"der Systemvariablen JAVA_TOOL_OPTIONS unter " Arbeitsplatz => Eigenschaften => Erweiterte Systemeinstellungen => Umgebungsvariablen" hinzufügen .

Wenn Sie bereits eine andere Eigenschaft festgelegt haben, JAVA_TOOL_OPTIONSfügen Sie einfach ein Leerzeichen hinzu und fügen Sie dann Ihre Eigenschaftszeichenfolge ein.

VolkanT
quelle
5

Zwei Optionen, von denen ich glaube, dass sie in den anderen Antworten nicht behandelt wurden:

Vermeiden Sie die Notwendigkeit

Was auch immer Sie tun, um die JVM-Standardzeitzone festzulegen, es ist sehr schwierig sicherzustellen, dass niemand anderes sie anders festlegt. Sie kann jederzeit ohne vorherige Ankündigung von einem anderen Teil Ihres Programms oder von einem anderen Programm, das in derselben JVM ausgeführt wird, festgelegt werden. Geben Sie in Ihren Zeitoperationen explizit an, welche Zeitzone Sie möchten, und Sie wissen immer, was Sie unabhängig von der JVM-Einstellung erhalten. Beispiel:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

Beispielausgabe:

2018-10-11T14: 59: 16.742020 + 05: 00 [Asien / Duschanbe]

System.setProperty

Für viele Zwecke wird das Folgende nicht der bevorzugte Weg sein, und es kann sicherlich missbraucht werden. Für "Wegwerf" -Programme finde ich es manchmal praktisch. Sie können eine Systemeigenschaft auch in Java festlegen:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

Dies wurde gerade gedruckt:

2018-10-11T21: 03: 12.218959 + 11: 00 [Australien / Tasmanien]

Wenn Sie eine Validierung der übergebenen Zeichenfolge wünschen, verwenden Sie:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());
Ole VV
quelle
4

Wenn Sie Maven verwenden :

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
MichalSv
quelle
mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"für Spring Boot v1.
Chloe
0

Wenn Sie in win7 die richtige Zeitzone als Parameter in JRE festlegen möchten, müssen Sie die deployment.propertiesim Pfad gespeicherte Datei bearbeiten c:\users\%username%\appdata\locallow\sun\java\deploymentund die Zeichenfolge deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone hinzufügen

Dave
quelle
Ich habe es versucht und es funktioniert nicht (JVM aus Intellij ausgeführt)
Kumetix