JVM und Zeitzonen

8

Ich habe ein Problem mit Java-Zeitzonen, wenn mir jemand helfen kann.

Ich habe eine Webanwendung auf Tomcat 5.5 (nicht sicher, ob dies relevant ist), mit der folgenden JVM-Version

%Vor%

Das Systemdatum ist, sagen wir -

%Vor%

In der Webanwendung führe ich an einem bestimmten Punkt einen Aufruf von Calendar.getInstance().getTime() durch und drucke diesen Zeitstempel in den Protokollen.

Problem ist, dass dieser Zeitstempel im EDT zurückgegeben wird, obwohl die Serverzeit in EST ist. Aus diesem Grund ist das zurückgegebene Datum 1 Stunde später als es sollte.

Was ich erreichen möchte, ist make Calendar.getInstance().getTime() , um ein Datum in derselben Zeitzone wie das System zurückzugeben.

Ich habe die Foren durchsucht und einige Vorschläge gefunden, dass der jvm die Zeitzone des Systems nicht korrekt liest. Ich habe versucht, den Tomcat mit -Duser.timezone=EST -Parameter zu starten, aber das System gibt immer Zeitstempel in der EDT-Zeitzone zurück. Bitte beachte, dass -Duser.timezone mit einem Nicht-est-Parameter zu funktionieren scheint. Die Probleme scheinen von anderer Art zu sein.

Mein Problem ist irgendwie ähnlich mit dieser SO-Frage . Ich versuche jedoch nur, das Datum in der gleichen Zeitzone zu finden, in der sich das System befindet, ohne eine spezielle Handhabung.

Können Sie mir helfen?

    
Andrei 15.08.2011, 14:24
quelle

7 Antworten

4

Ich hatte das gleiche Problem. Es stellt sich heraus, dass Java in der Datei /etc/sysconfig/clock und nicht in der Datei /etc/localtime gesucht hat. Dies für einen Kommentar für weitere Informationen

    
mlathe 26.04.2013, 17:44
quelle
5

EST und EDT sind sehr spezifisch und einer von ihnen wird immer "falsch" sein, abhängig von der Jahreszeit. Probieren Sie eine Zeitzone von "America / New_York" aus, um einfach zu erfahren, "wie spät es in New York ist".

z. B.

%Vor%

Liste nützlicher Zeitzonen:

Ссылка

    
Brian 15.08.2011 14:36
quelle
3

Dies ist ziemlich einfach, fügen Sie dies in Ihrer App-Hauptmethode (oder Servlet-Kontext) hinzu:

%Vor%

Dies legt die Zeitzone für alle Daten in Ihrem System fest.

    
Maurício Linhares 15.08.2011 14:38
quelle
2

Ich bin nicht sicher, ob dies in Java tatsächlich möglich ist, aber wenn es so ist, ist es sicherlich nicht die defacto Art, Dinge zu tun, wie andere gesagt haben. Siehe hier für die Anmerkungen von Oracle zu diesem Thema, insbesondere:

  

Die Zeitzonendaten der Java SE-Plattform werden nicht vom lokalen oder Hostbetriebssystem (OS) gelesen, daher aktualisieren die OS-Zeitzonen-Patches nicht die Zeitzonendaten der JRE-Software.

    
MarkH 28.08.2012 13:37
quelle
1

EDT & amp; EST - es ist die gleiche geografische Zone. Aber EST ist eine Standardzeit und es funktioniert nur im Winter (und manchmal sogar im Sommer), und EDT ist ein Tageslicht sparendes Pendant. Ihr Problem hängt wahrscheinlich mit der Sommerzeit zusammen, also würde ich in diese Richtung gehen. Sie können auch eine bestimmte Zeitzone angeben (normalerweise im Format Land / Stadt), indem Sie die Standardzeitzone festlegen. In diesem Fall sollten Sie jedoch sicher sein, dass keine Konflikte mit der aktuellen Zeitzone des Servers und der von Ihnen angegebenen Zeitzone auftreten / p>     

Stanislav Bashkyrtsev 15.08.2011 14:47
quelle
1

Unter Linux ist das ein bisschen nervig, weil Java (zumindest Oracle / Sun Java) lange Zeit eine fehlerhafte Methode verwendet hat (nun, ich nehme an, es war weniger fehlerhaft als es gestartet wurde, aber die Dinge haben sich geändert). p>

Meine beste Empfehlung wäre, die TZ-Umgebungsvariable festzulegen, da dies das erste ist, wonach gesucht wird; Die anderen Orte, an denen sie aussehen werden (zB. / etc / sysconfig / clock, / etc / localtime), sind fehlerhaft. Ich habe einen ausführlicheren Beitrag darüber in Ссылка , die einige Hintergrundreferenzen und einen Bestätigungsschritt enthält.

-Duser.timezone=Pacific/Auckland funktioniert möglicherweise auch, aber als ich es versuchte, tat es nicht.

Wenn Sie TZ einstellen, sollten Sie sicherstellen, dass Sie es an einem geeigneten Ort einstellen. Im WebLogic-Middleware-Container sollten Sie dies beispielsweise in setDomainEnv.sh festlegen, da WebLogic zuerst die Umgebung bereinigt und TZ nicht angezeigt wird (in meinem Beitrag wird angezeigt, wie Sie überprüfen können, ob ein JVM-Prozess die Umgebung sieht.)

    
Cameron Kerr 01.09.2014 10:05
quelle
1

Ich hatte das gleiche Problem auf dem Ubuntu-Server und kann die Datei / etc / sysconfig / clock nicht finden.

Ich habe es gelöst, benutze timedatectl um die Zeitzone einzustellen.

%Vor%     
Green Lei 01.11.2017 07:51
quelle

Tags und Links