tl; dr
myPreparedStatement.setObject( // Directly exchange java.time objects with database without the troublesome old java.sql.* classes.
… ,
LocalDate.parse( // Parse string as a `LocalDate` date-only value.
"2018-01-23".replace(" " , "T") // Alter input string to comply with standard ISO 8601 formatting.
)
)
java.time
Nowoczesne podejście wykorzystuje java.time klas, które zastąpić kłopotliwych starych klas starszych, takich jak java.util.Date
i java.sql.Date
.
Aby uzyskać wartość tylko dla daty, należy użyć LocalDate
. Klasa LocalDate
reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.
Przekształć łańcuch wejściowy zgodnie ze standardowym formatowaniem ISO 8601. Wymień SPACE w środku na T
.
String input = "2018-01-23".replace(" " , "T") ;
Klasy java.time używają standardowych formatów podczas analizowania/generowania ciągów. Więc nie trzeba określać wzorca formatowania.
LocalDate ld = LocalDate.parse(input) ;
Można bezpośrednio wymieniać java.time obiektów z bazy danych przy użyciu zgodnego z JDBC 4.2JDBC driver lub później. Możesz zapomnieć o przekształcaniu i usuwaniu klas java.sql. *.
myPreparedStatement.setObject(… , ld) ;
pobierania:
LocalDate ld = myResultSet.getObject(… , LocalDate.class) ;
O java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.
Gdzie można uzyskać lekcje java.time?
- Java SE 8, Java SE 9, a później
- wbudowanej.
- Część standardowego interfejsu API języka Java z pakietem implementacji.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6 i Java SE 7
- Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
- Android
- Późniejsze wersje Androida wdrożeń wiązce klas java.time.
- Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….
Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval
, YearWeek
, YearQuarter
i more.
W zależności od przypadku użycia możesz nie chcieć wysłać daty z klienta. Zamiast tego należy wstawić wyzwalacz w tabeli, aby ustawić kolumnę na "teraz" po stronie serwera bazy danych. W ten sposób można uzyskać spójny znacznik czasu po stronie serwera, chronić się przed problemami zegara/strefy czasowej po stronie klienta, a nowe rekordy mają nadal aktualizowaną datę, jeśli rekordy są wstawiane z innej aplikacji klienckiej lub transakcji addhoc. – Glenn
również dziękuję za porady. – giozh