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.Date
i java.sql.Date
JDBC 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:
Instant
zamiast java.util.Date
Oba stanowią moment w UTC. ale teraz z nanosekundami zamiast milisekund.
LocalDate
zamiast 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 LocalDate
klasy 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.LocalDate
Java 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ść LocalDate
przezsetObject
w PreparedStatement
celu zapisania w polu „DATA SQL”.
myPreparedStatement.setObject( 1 , localDate );
Podobnie, użyj, ResultSet::getObject
aby 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 Instant
klasę, która reprezentuje chwilę na osi czasu w UTC. Instant
Jest podobny pomysłu do java.util.Date
. Pamiętaj jednak, że Instant
ma rozdzielczość do nanosekund, a rozdzielczość java.util.Date
tylko 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, ZoneId
aby 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 .