tl; dr
Jak przekonwertować java.util.Date na java.sql.Date?
Nie rób Obie klasy są przestarzałe.
- Używaj klas java.time zamiast starszego typu
java.util.Datei java.sql.DateJDBC 4.2 lub nowszego.
- Konwertuj na / z java.time, jeśli współpracujesz z kodem, który nie został jeszcze zaktualizowany do java.time.
Przykładowe zapytanie z 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.
)
Części zamienne:
Instantzamiast java.util.Date
Oba stanowią moment w UTC. ale teraz z nanosekundami zamiast milisekund.
LocalDatezamiast java.sql.Date
Oba reprezentują tylko datę, bez pory dnia i strefy czasowej.
Detale
Jeśli próbujesz pracować z wartościami opartymi tylko na dacie (bez pory dnia, strefy czasowej), użyj LocalDateklasy zamiast java.util.Date.

java.time
W Javie 8 i nowszych kłopotliwe stare klasy daty i czasu dołączone do wczesnych wersji Javy zostały zastąpione przez nowy pakiet java.time . Zobacz samouczek Oracle . Duża część funkcji została przeniesiona z powrotem do Java 6 i 7 w ThreeTen-Backport, a następnie dostosowana do Androida w ThreeTenABP .
SQL typ danych DATE ma być data-tylko, ze nie ma czasu na dzień i bez strefy czasowej. Java nigdy nie miała takiej klasy † aż do wersji java.time.LocalDateJava 8. Stwórzmy taką wartość, uzyskując dzisiejszą datę według określonej strefy czasowej (strefa czasowa jest ważna przy ustalaniu daty, kiedy nowy dzień zaczyna się wcześniej w Paryżu niż w Montrealu, ponieważ przykład).
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".
W tym momencie możemy być skończeni. Jeśli Twój sterownik JDBC jest zgodny ze specyfikacją JDBC 4.2 , powinieneś być w stanie przejść LocalDateprzezsetObject w PreparedStatementcelu zapisania w polu „DATA SQL”.
myPreparedStatement.setObject( 1 , localDate );
Podobnie, użyj, ResultSet::getObjectaby pobrać z kolumny DATA SQL do JavyLocalDate obiektu . Określenie klasy w drugim argumencie powoduje, że kod jest bezpieczny dla typu .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Innymi słowy, całe to pytanie nie ma znaczenia w JDBC 4.2 lub nowszym.
Jeśli sterownik JDBC nie działa w ten sposób, musisz wrócić do konwersji na typy java.sql.
Konwertuj na java.sql.Date
Aby przekonwertować, użyj nowych metod dodanych do starych klas daty i godziny. Możemy zadzwonić, java.sql.Date.valueOf(…)aby przekonwertować LocalDate.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
I iść w innym kierunku.
LocalDate localDate = sqlDate.toLocalDate();
Konwertowanie z java.util.Date
Chociaż powinieneś unikać używania starych klas daty i godziny, możesz być do tego zmuszony podczas pracy z istniejącym kodem. Jeśli tak, możesz przekonwertować na / z java.time.
Przejdź przez Instantklasę, która reprezentuje chwilę na osi czasu w UTC. InstantJest podobny pomysłu do java.util.Date. Pamiętaj jednak, że Instantma rozdzielczość do nanosekund, a rozdzielczość java.util.Datetylko milisekund .
Aby przekonwertować, użyj nowych metod dodanych do starych klas. Na przykład java.util.Date.from( Instant )i java.util.Date::toInstant.
Instant instant = myUtilDate.toInstant();
Aby ustalić datę, potrzebujemy kontekstu strefy czasowej. W danym momencie data zmienia się na całym świecie w zależności od strefy czasowej. Zastosuj a, ZoneIdaby uzyskać ZonedDateTime.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† Klasa java.sql.Date udaje, że jest tylko datą, bez pory dnia, ale w rzeczywistości robi porę dnia, dostosowaną do północy. Zagmatwane? Tak, stare lekcje daty i godziny są bałaganem.
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date, Calendar, i SimpleDateFormat.
Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby java.sql.*klas.
Gdzie można uzyskać klasy java.time?

Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval, YearWeek, YearQuarter, i więcej .