tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
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.
Ich muss alle zeitbezogenen Operationen zu GMT / UTC erzwingen
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.
Instant instant = Instant.now() ; // Capture current moment 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.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
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 . Das OffsetDateTime
wird von JDBC benötigt, während Instant
& ZonedDateTime
optional sind.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
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:
- Auszug a
Instant
: odt.toInstant()
- Passen Sie den angegebenen Offset auf einen Offset von Null an: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
Ü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?