tl; dr
Wie konvertiere ich java.util.Date in java.sql.Date?
Tu es nicht. Beide Klassen sind veraltet.
- Verwenden Sie java.time- Klassen anstelle von Legacy
java.util.Date
& java.sql.Date
mit JDBC 4.2 oder höher.
- Konvertieren Sie nach / von java.time, wenn Sie mit Code zusammenarbeiten, der noch nicht auf java.time aktualisiert wurde.
Beispielabfrage mit PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Ersatz:
Instant
anstelle von java.util.Date
Beide stellen einen Moment in UTC dar. aber jetzt mit Nanosekunden statt Millisekunden.
LocalDate
anstelle von java.sql.Date
Beide stellen einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone dar.
Einzelheiten
Wenn Sie versuchen, mit Nur-Datum-Werten (keine Uhrzeit, keine Zeitzone) zu arbeiten, verwenden Sie die LocalDate
Klasse anstelle von java.util.Date
.
java.time
In Java 8 und höher wurden die problematischen alten Datums- / Uhrzeitklassen, die mit früheren Versionen von Java gebündelt wurden, durch das neue Paket java.time ersetzt . Siehe Oracle Tutorial . Ein Großteil der Funktionen wurde in ThreeTen-Backport auf Java 6 & 7 zurückportiert und in ThreeTenABP weiter an Android angepasst .
Ein SQL-Datentyp DATE
soll nur ein Datum ohne Tageszeit und ohne Zeitzone sein. Java hatte bis genau java.time.LocalDate
in Java 8 nie genau eine solche Klasse †. Erstellen wir einen solchen Wert, indem wir das heutige Datum nach einer bestimmten Zeitzone abrufen (die Zeitzone ist wichtig, um ein Datum zu bestimmen, wenn ein neuer Tag in Paris früher als in Montréal beginnt, z Beispiel).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
An diesem Punkt können wir fertig sein. Wenn Ihr JDBC-Treiber der JDBC 4.2-Spezifikation entspricht , sollten Sie in der Lage sein, ein LocalDate
Via setObject
an ein PreparedStatement
zu übergeben, um es in einem SQL DATE-Feld zu speichern.
myPreparedStatement.setObject( 1 , localDate );
Verwenden Sie ResultSet::getObject
diese Option auch, um von einer SQL DATE-Spalte in ein Java- LocalDate
Objekt abzurufen . Wenn Sie die Klasse im zweiten Argument angeben, ist Ihr Code typsicher .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Mit anderen Worten, diese gesamte Frage ist unter JDBC 4.2 oder höher irrelevant .
Wenn Ihr JDBC-Treiber nicht auf diese Weise funktioniert, müssen Sie auf die Konvertierung in die Typen java.sql zurückgreifen.
In java.sql.Date konvertieren
Verwenden Sie zum Konvertieren neue Methoden, die den alten Datums- / Zeitklassen hinzugefügt wurden. Wir können anrufen java.sql.Date.valueOf(…)
, um a zu konvertieren LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
Und in die andere Richtung gehen.
LocalDate localDate = sqlDate.toLocalDate();
Konvertieren von java.util.Date
Während Sie die Verwendung der alten Datums- / Uhrzeitklassen vermeiden sollten, müssen Sie möglicherweise gezwungen sein, mit vorhandenem Code zu arbeiten. In diesem Fall können Sie nach / von java.time konvertieren.
Gehen Sie die Instant
Klasse durch, die einen Moment auf der Zeitachse in UTC darstellt. An Instant
ist in der Idee ähnlich wie a java.util.Date
. Beachten Sie jedoch, dass Instant
die Auflösung bis zu Nanosekunden und java.util.Date
die Auflösung nur Millisekunden beträgt.
Verwenden Sie zum Konvertieren neue Methoden, die den alten Klassen hinzugefügt wurden. Zum Beispiel java.util.Date.from( Instant )
und java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Um ein Datum zu bestimmen, benötigen wir den Kontext einer Zeitzone. Für jeden Moment variiert das Datum weltweit nach Zeitzone. Wenden Sie ein ZoneId
an, um ein zu erhalten ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† Die java.sql.Date Klasse gibt vor , ohne Zeit-of-day date-nur zu sein , aber tatsächlich hat eine Laufzeit-Tag, zu einer Mitternacht Zeit angepasst. Verwirrend? Ja, die alten Datums- und Uhrzeitklassen sind ein Chaos.
Ü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 .