tl;dr
Użyj JPA 2.2 za wsparcie java.time .
Użyj klasy zawierającej tylko datę w Javie, aby pracować z wartościami zawierającymi tylko datę w SQL.
LocalDate // Represent a date-only, without a time-of-day and without a time zone.
.now( // Get today's date…
ZoneId.of( "Africa/Tunis" ) // …as seen in the wall-clock time used by the people of a particular region.
) // Returns a `LocalDate` object.
.plusMonths( 1 ) // Returns another `LocalDate` object, per immutable objects pattern.
java.time
JPA 2.2 obsługuje teraz nowoczesny java.time zajęcia. Nie ma już potrzeby korzystania z Joda-Time.
Nie nie użyj java.sql.Date
. Te zajęcia udają do reprezentowania tylko daty, ale w rzeczywistości ma ustawiony czas na UTC z powodu okropnej decyzji projektowej o dziedziczeniu po java.util.Date
(która pomimo nazwy reprezentuje datę i pora dnia i przesunięcie o zero dla samego UTC). Te starsze klasy to okropny bałagan. Sun, Oracle i społeczność JCP zrezygnowały z zajęć z tych zajęć lata temu wraz z przyjęciem JSR 310, i ty też powinieneś.
LocalDate
LocalDate
klasa reprezentuje wartość zawierającą tylko datę bez pory dnia i bez strefy czasowej
lub przesunięcie-od-UTC
.
Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W dowolnym momencie data różni się na całym świecie w zależności od strefy. Na przykład kilka minut po północy w Paryżu Francja to nowy dzień, ale wciąż „wczoraj” w Montréal Québec .
Jeśli nie określono strefy czasowej, maszyna JVM niejawnie stosuje swoją bieżącą domyślną strefę czasową. Ta wartość domyślna może zmiana w dowolnym momencie w czasie działania(!), więc wyniki mogą się różnić. Lepiej określić żądaną/oczekiwaną strefę czasową jako argument. Jeśli jest to krytyczne, potwierdź strefę z użytkownikiem.
Podaj właściwą nazwę strefy czasowej
w formacie Kontynent/Region
, na przykład Ameryka/Montreal
, Afryka/Casablanca
lub Pacyfik/Auckland
. Nigdy nie używaj 2-4-literowego skrótu, takiego jak EST
lub IST
ponieważ oni nie prawdziwe strefy czasowe, nieustandaryzowane, a nawet nie unikalne(!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Jeśli chcesz użyć bieżącej domyślnej strefy czasowej JVM, poproś o nią i przekaż jako argument. Jeśli zostanie pominięty, kod staje się niejednoznaczny, ponieważ nie wiemy na pewno, czy zamierzałeś użyć domyślnego, czy też, podobnie jak wielu programistów, nie wiedziałeś o problemie.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
Lub podaj datę. Możesz ustawić miesiąc według liczby, z rozsądną numeracją 1-12 dla stycznia-grudnia.
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ; // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
Lub lepiej użyj Miesiąc
predefiniowane obiekty wyliczeniowe, po jednym na każdy miesiąc w roku. Wskazówka:użyj tych miesiąca
obiekty w całej bazie kodu, a nie tylko liczbę całkowitą, aby Twój kod był bardziej samodokumentowany, zapewniał prawidłowe wartości i zapewniał Bezpieczeństwo typu
. To samo dla Rok
&RokMiesiąc
.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
Matematyka data-czas
Najwyraźniej chcesz zacząć od jednej daty i otrzymać jeden miesiąc później jako zakres dat.
LocalDate monthLater = ld.plusMonths( 1 ) ;
JDBC 4.2
Od JDBC 4.2 sterownik JDBC jest wymagany do obsługi niektórych kluczy java.time klasy takie jak LocalDate
.
Zakres dat
Zwróć uwagę na poniższe linki do ThreeTen-Extra . Możesz znaleźć LocalDateRange
klasę, która będzie przydatna, jeśli dużo pracujesz z zakresami dat.
O java.time
java.time
Framework jest wbudowany w Javę 8 i nowsze. Te klasy zastępują kłopotliwe stare dziedzictwo
klasy daty i godziny, takie jak java. util.Data
, Kalendarz
, &SimpleDateFormat
.
Aby dowiedzieć się więcej, zobacz Samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Joda-Time projekt, teraz w trybie konserwacji , zaleca migrację do java.time zajęcia.
Możesz wymienić java.time obiekty bezpośrednio z bazą danych. Użyj sterownika JDBC
zgodny z JDBC 4.2
lub później. Nie potrzeba ciągów, nie potrzeba java.sql.*
zajęcia.
Skąd wziąć zajęcia java.time?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
i nowsze — Część standardowego interfejsu Java API z dołączoną implementacją.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
- Java SE 6
i Java SE 7
- Większość java.time funkcjonalność została przeniesiona do Javy 6 i 7 w ThreeTen-Backport .
- Android
- Późniejsze wersje pakietów Androida implementacji java.time zajęcia.
- W przypadku wcześniejszych wersji Androida (<26) ThreeTenABP projekt dostosowuje Backport ThreeTen (wspomniano powyżej). Zobacz Jak korzystać z ThreeTenABP… .
ThreeTen-Extra
projekt rozszerza java.time o dodatkowe zajęcia. Ten projekt jest poligonem doświadczalnym dla możliwych przyszłych dodatków do java.time. Możesz znaleźć kilka przydatnych klas, takich jak Przedział
, YearWeek
, YearQuarter
i więcej
.