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?
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
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.
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.
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>
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.)