tl; dr
Das Joda-Time- Projekt befindet sich im Wartungsmodus und wird jetzt durch java.time- Klassen ersetzt.
- Verwenden Sie einfach
java.time.Instant
Klasse.
- Kein Bedarf für:
LocalDateTime
java.sql.Timestamp
- Saiten
Erfassen Sie den aktuellen Moment in UTC.
Instant.now()
So speichern Sie diesen Moment in der Datenbank:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
So rufen Sie diesen Moment aus der Datenbank ab:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Zum Einstellen der Wanduhrzeit auf die einer bestimmten Zeitzone.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
ist die falsche Klasse
Andere Antworten sind korrekt, weisen jedoch nicht darauf hin, dass dies LocalDateTime
die falsche Klasse für Ihren Zweck ist.
Sowohl in java.time als auch in Joda-TimeLocalDateTime
fehlt einem absichtlich jedes Konzept der Zeitzone oder des Versatzes von UTC. Als solches ist es nicht repräsentiert einen Moment, und ist nicht ein Punkt auf der Timeline. A LocalDateTime
repräsentiert eine grobe Vorstellung von möglichen Momenten in einem Bereich von etwa 26 bis 27 Stunden.
Verwenden Sie a LocalDateTime
für, wenn die Zone / der Versatz unbekannt ist (keine gute Situation) oder wenn der Zonenversatz unbestimmt ist. Zum Beispiel würde "Weihnachten beginnt im ersten Moment des 25. Dezember 2018" als dargestellt LocalDateTime
.
Verwenden Sie a ZonedDateTime
, um einen Moment in einer bestimmten Zeitzone darzustellen. Zum Beispiel Weihnachten, das in einer bestimmten Zone beginnt Pacific/Auckland
oder America/Montreal
mit einem ZonedDateTime
Objekt dargestellt wird.
Verwenden Sie für einen Moment immer in UTC Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Wenden Sie eine Zeitzone an. Gleicher Moment, gleicher Punkt auf der Zeitachse, aber mit einer anderen Wanduhrzeit betrachtet.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Wenn ich also nur zwischen LocalDate und LocalDateTime konvertieren kann,
Nein, falsche Strategie. Wenn Sie einen Nur-Datum-Wert haben und einen Datums- / Uhrzeitwert möchten, müssen Sie eine Uhrzeit angeben. Diese Tageszeit ist an diesem Datum möglicherweise nicht für eine bestimmte Zone gültig. In diesem Fall ZonedDateTime
passt die Klasse die Tageszeit automatisch nach Bedarf an.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Wenn Sie den ersten Moment des Tages als Tageszeit verwenden möchten , lassen Sie java.time diesen Moment bestimmen. Gehen Sie nicht davon aus, dass der Tag um 00:00:00 Uhr beginnt. Anomalien wie die Sommerzeit (DST) bedeuten, dass der Tag möglicherweise zu einer anderen Zeit beginnt, z. B. um 01:00:00 Uhr.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
ist die falsche Klasse
Das java.sql.Timestamp
ist Teil der problematischen alten Datums- / Uhrzeitklassen , die jetzt Legacy sind und vollständig durch die Klassen java.time ersetzt werden. Diese Klasse wurde verwendet, um einen Moment in UTC mit einer Auflösung von Nanosekunden darzustellen . Diesem Zweck wird jetzt gedient java.time.Instant
.
JDBC 4.2 mit getObject
/setObject
Ab JDBC 4.2 und höher kann Ihr JDBC-Treiber java.time-Objekte direkt mit der Datenbank austauschen, indem er Folgendes aufruft:
Beispielsweise:
myPreparedStatement.setObject( … , instant ) ;
… und …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Vermächtnis ⬌ modern umwandeln
Wenn Sie mit altem Code arbeiten müssen, der noch nicht auf java.time aktualisiert wurde , konvertieren Sie mit neuen Methoden, die zu den alten Klassen hinzugefügt wurden, hin und her.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…und…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Ü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
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
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 Zeichenfolgen, keine Notwendigkeit für java.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
- Java SE 8 , Java SE 9 und höher
- Eingebaut.
- Teil der Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
- Java SE 6 und Java SE 7
- Android
- Spätere Versionen von Android-Bundle-Implementierungen der Klassen java.time.
- Für frühere Android -Geräte ( <26) passt das ThreeTenABP- Projekt ThreeTen-Backport (oben erwähnt) an. Siehe Verwendung von ThreeTenABP… .
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .
java.sql.Timestamp
Klasse jetzt ein Vermächtnis, das durch die Klassen java.time ersetzt wird , insbesondere durchInstant
.