Sie verwenden problematische alte Klassen, die jetzt durch java.time-Klassen ersetzt werden.
Hier ist, wie Sie dem Rat von Jon Skeet in einem Kommentar zu der Frage gegeben folgen.
java.time
Der java.time Rahmen in Java 8 und später gebaut wird. Diese Klassen ersetzen die alten problematischen Datum-Zeit-Klassen wie java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
. Das Team Joda-Time empfiehlt auch die Migration zu java.time.
Weitere Informationen finden Sie unter Oracle Tutorial. Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen.
Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport und weiter in ThreeTenABP auf Android angepasst.
OffsetDateTime
Sie können diese Eingabezeichenfolge als OffsetDateTime
Objekt analysieren.
OffsetDateTime odt = OffsetDateTime.parse("2016-07-21T21:30:47.492+0000");
Wenn Ihre JDBC-Treiber mit JDBC 4.2 oder höher entsprechen, können Sie in der Lage sein, passieren/holen über die PreparedStatement::setObject
und ResultSet::getObject
Methoden in SQL. Wenn nicht, konvertieren Sie in den alten java.sql-Typ.
Konvertieren erfordert ein Objekt Instant
. Eine Instant
ist eine grundlegendere Bausteinklasse in java.time, der die Flexibilität einer OffsetDateTime
fehlt. Die Klasse Instant
repräsentiert einen Moment auf der Timeline in UTC mit einer Auflösung von bis zu Nanosekunden. Extrahieren Sie einen Instant
von diesem OffsetDateTime
.
Instant instant = odt.toInstant();
Pass die Instant
auf ein neues Verfahren zur alten java.sql Klasse hinzugefügt.
java.sql.Timestamp ts = java.sql.Timestamp.from(instant);
Dann rufen Sie die PreparedStatement::setTimestamp
und ResultSet::getTimestamp
Methoden.
myPreparedStatement.setTimestamp(1 , ts);
…
java.sql.Timestamp ts = myResultSet.getTimestamp(1);
Nach einem java.sql.Timestamp
holen, konvertiert sofort zu einem java.time Klasse, Instant
. Verwenden Sie die java.sql-Klassen nur dort, wo die direkte Unterstützung für java.time-Typen in Ihrem JDBC-Treiber fehlt, und minimieren Sie selbst dann die Verwendung der java.sql-Klassen. Funktioniert Ihre Geschäftslogik in java.time?
Instant instant = ts.toInstant();
Verwirrende Klassennamen
Verwechseln Sie nicht die beiden alten Date
Klassen mit Java gebündelt. Die java.util.Date
repräsentiert ein Datum und eine Uhrzeit. Ein java.sql.Date
ist nur ein Datum Wert nur ohne Zeit-of-Tag darstellt (aber eine Time-of-Tag tatsächlich hat verwirrend weil es ein ungeschickter Hack von einem ungeschickten Klasse Design ist).
Vermeiden Sie die Klassen java.util.Date
und java.util.Calendar
und java.text.SimpleDateFormat
vollständig. Und minimieren Sie Ihre Nutzung der java.sql.Date
/.Time
/.Timestamp
Klassen wie oben erörtert.
Welche Datenbanksoftware verwenden Sie? –
Was hast du bisher versucht? Es hört sich so an, als müsste man die Zeichenkette grundsätzlich analysieren, wahrscheinlich zu einem 'java.util.Date' oder' java.time.Instant', dann zu einem 'java.sql.Timestamp' konvertieren und diesen in einem' PreparedStatement' verwenden. –
Kröte für Oracle –