tl; dr
Verwenden Sie nur moderne java.time- Klassen. Verwenden Sie niemals die schreckliche Erbe Klassen wie SimpleDateFormat
, Date
oder java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Oder verwenden Sie die aktuelle Standardzeitzone der JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time & JDBC 4.2
Der moderne Ansatz verwendet die oben gezeigten Klassen java.time .
Wenn Ihr JDBC-Treiber mit JDBC 4.2 kompatibel ist , können Sie java.time- Objekte direkt mit der Datenbank austauschen . Verwenden Sie PreparedStatement::setObject
und ResultSet::getObject
.
Verwenden Sie java.sql nur für Treiber vor JDBC 4.2
Wenn Ihr JDBC-Treiber für die Unterstützung von java.time- Typen noch nicht mit JDBC 4.2 kompatibel ist , müssen Sie auf die Verwendung der java.sql-Klassen zurückgreifen.
Daten speichern.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Daten abrufen.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Die Typen java.sql, z. B. java.sql.Timestamp
, sollten nur für die Übertragung in und aus der Datenbank verwendet werden. Konvertieren Sie sofort in java.time-Typen in Java 8 und höher.
java.time.Instant
A java.sql.Timestamp
abbildet ein java.time.Instant
, einen Moment auf der Timeline in UTC. Beachten Sie die neue Konvertierungsmethode toInstant
, die der alten Klasse hinzugefügt wurde.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Zeitzone
Wenden Sie die gewünschte / erwartete Zeitzone ( ZoneId
) an, um a zu erhalten ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Formatierte Zeichenfolgen
Verwenden Sie a DateTimeFormatter
, um Ihre Zeichenfolge zu generieren. Die Mustercodes ähneln denen von, sind java.text.SimpleDateFormat
jedoch nicht genau. Lesen Sie das Dokument daher sorgfältig durch.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Dieses spezielle Format ist hinsichtlich seiner genauen Bedeutung nicht eindeutig, da es keinen Hinweis auf einen Versatz von UTC oder Zeitzone gibt.
ISO 8601
Wenn Sie in dieser Angelegenheit mitreden können, empfehlen wir Ihnen, Standardformate nach ISO 8601 zu verwenden, anstatt Ihre eigenen zu rollen. Das Standardformat ist Ihrem sehr ähnlich. Zum Beispiel :
2016-02-20T03:26:32+05:30
.
Die java.time-Klassen verwenden standardmäßig diese Standardformate, sodass kein Muster angegeben werden muss. Die ZonedDateTime
Klasse erweitert das Standardformat durch Anhängen des Namens der Zeitzone (eine sinnvolle Verbesserung).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
In java.sql konvertieren
Sie können von java.time zurück nach konvertieren java.sql.Timestamp
. Extrahieren Sie eine Instant
aus dem ZonedDateTime
.
Den alten Klassen wurden neue Methoden hinzugefügt, um die Konvertierung in / von java.time-Klassen zu erleichtern.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.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
.
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?
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 .