java.time
Der moderne Ansatz verwendet die java.time- Klassen, die die problematischen älteren Datums- / Zeitklassen ersetzen, die mit den frühesten Versionen von Java gebündelt sind.
Die java.sql.Timestamp
Klasse ist eine dieser Legacy-Klassen. Nicht mehr gebraucht. Verwenden Sie stattdessen Instant
oder andere java.time-Klassen direkt mit Ihrer Datenbank unter Verwendung von JDBC 4.2 und höher.
Die Instant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Wenn Sie mit einer vorhandenen zusammenarbeiten müssen Timestamp
, konvertieren Sie diese sofort in java.time über die neuen Konvertierungsmethoden, die den alten Klassen hinzugefügt wurden.
Instant instant = myTimestamp.toInstant() ;
Geben Sie zum Anpassen in eine andere Zeitzone die Zeitzone als ZoneId
Objekt an. Geben Sie einen richtigen Zeitzonennamen im Format continent/region
, wie zum Beispiel America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals Pseudozonen mit 3-4 Buchstaben, wie z. B. EST
oder IST
weil sie keine echten Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Auf das anwenden, Instant
um ein ZonedDateTime
Objekt zu erzeugen .
ZonedDateTime zdt = instant.atZone( z ) ;
Um eine Zeichenfolge für die Anzeige für den Benutzer zu generieren, durchsuchen Sie den Stapelüberlauf DateTimeFormatter
nach vielen Diskussionen und Beispielen.
Bei Ihrer Frage geht es wirklich darum, in die andere Richtung zu gehen, von der Eingabe von Benutzerdaten bis zu den Datums- / Uhrzeitobjekten. Im Allgemeinen ist es am besten, Ihre Dateneingabe in zwei Teile zu unterteilen, ein Datum und eine Uhrzeit.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Ihre Frage ist nicht klar. Möchten Sie das Datum und die Uhrzeit interpretieren, die der Benutzer eingegeben hat, um in UTC zu sein? Oder in einer anderen Zeitzone?
Wenn Sie UTC gemeint haben, erstellen Sie eine OffsetDateTime
mit einem Offset unter Verwendung der Konstante für UTC , ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Wenn Sie eine andere Zeitzone gemeint haben, kombinieren Sie diese zusammen mit einem Zeitzonenobjekt, a ZoneId
. Aber welche Zeitzone? Möglicherweise erkennen Sie eine Standardzeitzone. Wenn dies kritisch ist, müssen Sie dies dem Benutzer bestätigen, um sicherzugehen, dass er beabsichtigt ist.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Um ein einfacheres Objekt zu erhalten, das sich per Definition immer in UTC befindet, extrahieren Sie ein Instant
.
Instant instant = odt.toInstant() ;
…oder…
Instant instant = zdt.toInstant() ;
An Ihre Datenbank senden.
myPreparedStatement.setObject( … , instant ) ;
Ü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 .
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 .