Ich muss alle zeitbezogenen Vorgänge auf GMT / UTC erzwingen, unabhängig von der auf der Maschine eingestellten Zeitzone. Gibt es eine bequeme Möglichkeit, dies im Code zu tun?
Zur Verdeutlichung verwende ich die DB-Serverzeit für alle Vorgänge, sie wird jedoch entsprechend der lokalen Zeitzone formatiert.
Vielen Dank!
Antworten:
Das OP beantwortete diese Frage, um die Standardzeitzone für eine einzelne Instanz einer laufenden JVM zu ändern. Legen Sie die
user.timezone
Systemeigenschaft fest:Wenn Sie beim Abrufen von Datums- / Zeit- / Zeitstempelobjekten aus einer Datenbank bestimmte Zeitzonen festlegen müssen
ResultSet
, verwenden Sie die zweite Form dergetXXX
Methoden, die einCalendar
Objekt annehmen:Oder legen Sie das Datum in einem PreparedStatement fest:
Dadurch wird sichergestellt, dass der in der Datenbank gespeicherte Wert konsistent ist, wenn die Datenbankspalte keine Zeitzoneninformationen enthält.
Die Klassen
java.util.Date
undjava.sql.Date
speichern die tatsächliche Zeit (Millisekunden) in UTC. Verwenden Sie diese Option, um diese bei der Ausgabe in eine andere Zeitzone zu formatierenSimpleDateFormat
. Sie können dem Wert auch eine Zeitzone mithilfe eines Kalenderobjekts zuordnen:Nützliche Referenz
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
quelle
Auch wenn Sie die JVM-Zeitzone auf diese Weise einstellen können
oder
-Duser.timezone=GMT
in den JVM-Argumenten.quelle
System.setProperty("user.timezone" ...)
funktioniert nichtIch musste die JVM-Zeitzone für Windows 2003 Server festlegen, da immer GMT für new Date () zurückgegeben wurde.
-Duser.timezone=America/Los_Angeles
Oder Ihre entsprechende Zeitzone. Eine Liste von Zeitzonen zu finden, erwies sich auch als etwas schwierig ...
Hier sind zwei Listen;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
quelle
Sie können die Zeitzone mit TimeZone.setDefault () ändern :
quelle
für mich nur schnell SimpleDateFormat,
Formatieren Sie dann das Datum mit einer anderen Zeitzone.
quelle
Ich würde die Zeit in einer Rohform (langer Zeitstempel oder Java-Datum) aus der Datenbank abrufen und sie dann mit SimpleDateFormat formatieren oder mit Calendar bearbeiten. In beiden Fällen sollten Sie die Zeitzone der Objekte festlegen, bevor Sie sie verwenden.
Siehe
SimpleDateFormat.setTimeZone(..)
undCalendar.setTimeZone(..)
für Detailsquelle
tl; dr
Vermeiden Sie je nach Host-Betriebssystem oder JVM die Standardzeitzone
Ich empfehle Ihnen, Ihren gesamten Code zu schreiben, um die gewünschte / erwartete Zeitzone explizit anzugeben. Sie müssen nicht von der aktuellen Standardzeitzone der JVM abhängig sein. Beachten Sie außerdem, dass sich die aktuelle Standardzeitzone der JVM jederzeit zur Laufzeit ändern kann, wobei jeder Code in einem beliebigen Thread einer App aufgerufen wird
TimeZone.setDefault
. Ein solcher Aufruf wirkt sich sofort auf alle Apps in dieser JVM aus.java.time
Einige der anderen Antworten waren korrekt, aber jetzt veraltet. Die schrecklichen Datums- / Uhrzeitklassen, die mit den frühesten Versionen von Java gebündelt wurden, waren fehlerhaft und wurden von Personen geschrieben, die die Komplexität und Feinheiten der Datums- / Uhrzeitbehandlung nicht verstanden hatten.
Die alten Datums- und Uhrzeitklassen wurden durch die ersetzt alten Datums- / Uhrzeitklassen wurden in JSR 310 definierten java.time- Klassen ersetzt.
Verwenden Sie, um eine Zeitzone darzustellen
ZoneId
. Verwenden Sie, um einen Versatz von UTC darzustellenZoneOffset
. Ein Versatz ist lediglich eine Anzahl von Stunden-Minuten-Sekunden vor oder hinter dem Nullmeridian. Eine Zeitzone ist viel mehr. Eine Zeitzone ist eine Geschichte der vergangenen, gegenwärtigen und zukünftigen Änderungen des Versatzes, den die Menschen einer bestimmten Region verwenden.Verwenden Sie für einen Versatz von null Stunden-Minuten-Sekunden die Konstante
ZoneOffset.UTC
.Instant
Verwenden Sie eine, um den aktuellen Moment in UTC zu erfassen
Instant
. Diese Klasse repräsentiert einen Moment in UTC, per Definition immer in UTC.ZonedDateTime
Stellen Sie sich auf eine Zeitzone ein, um denselben Moment durch die Wanduhrzeit zu sehen, die von den Menschen einer bestimmten Region verwendet wird. Gleicher Moment, gleicher Punkt auf der Zeitachse, andere Wanduhrzeit.
Datenbank
Sie erwähnen eine Datenbank.
Um einen Moment aus der Datenbank abzurufen, sollte Ihre Spalte einen Datentyp haben, der dem SQL-Standard ähnelt
TIMESTAMP WITH TIME ZONE
. Rufen Sie ein Objekt anstelle einer Zeichenfolge ab. In JDBC 4.2 und höher können wir java.time- Objekte mit der Datenbank austauschen . DasOffsetDateTime
wird von JDBC benötigt, währendInstant
&ZonedDateTime
optional sind.In den meisten Datenbanken und Treibern würde ich vermuten, dass Sie den Moment wie in UTC sehen werden. Wenn nicht, können Sie auf zwei Arten anpassen:
Instant
:odt.toInstant()
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Strings, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
quelle
Erstellen Sie ein Client / Server-Paar, damit der Client-Server nach der Ausführung die richtige Uhrzeit und das richtige Datum sendet. Dann fragt der Client den Server nach GMT und der Server sendet die Antwort richtig zurück.
quelle
Verwenden Sie die Systemeigenschaft:
quelle
Führen Sie diese Zeile in MySQL aus, um Ihre Zeitzone zurückzusetzen:
quelle
Beeindruckend. Ich weiß, dass dies ein alter Thread ist, aber alles, was ich sagen kann, ist, TimeZone.setDefault () in keinem Code auf Benutzerebene aufzurufen. Dies legt immer die Zeitzone für die gesamte JVM fest und ist fast immer eine sehr schlechte Idee. Erfahren Sie, wie Sie die Bibliothek joda.time oder die neue DateTime-Klasse in Java 8 verwenden, die der Bibliothek joda.time sehr ähnlich ist.
quelle
Wenn Sie GMT-Zeit nur mit intiger erhalten möchten: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
quelle