Inne odpowiedzi są poprawne, zwłaszcza odpowiedź java.time autorstwa arganzheng . Jak niektórzy wspomnieli, powinieneś unikać starych klas java.util.Date/.Calendar, ponieważ są one źle zaprojektowane, mylące i kłopotliwe. Zostały one wyparte przez klasy java.time.
Pozwól, że dodam uwagi na temat strategii związanej z obsługą północy i przedziałów czasu .
Wpół otwarty
W pracy z datą przedziały czasu są często określane przy użyciu metody „półotwartej”. W tym podejściu początek jest włączający, a zakończenie wyłączny . To rozwiązuje problemy, a jeśli jest konsekwentnie stosowane, znacznie ułatwia rozumowanie na temat obsługi daty i czasu.
Jednym z rozwiązanych problemów jest określenie końca dnia. Czy ostatnia chwila dnia 23:59:59.999
( milisekundy )? Być może w klasie java.util.Date (od najwcześniejszej Javy; kłopotliwe - unikaj tej klasy!) Oraz w bardzo udanej bibliotece Joda-Time . Ale w innym oprogramowaniu, takim jak baza danych, taka jak Postgres, ostatnia chwila będzie 23:59:59.999999
( mikrosekund ). Ale w innym oprogramowaniu, takim jak framework java.time (wbudowany w Javę 8 i później, następca Joda-Time) oraz w niektórych bazach danych, takich jak Baza danych H2 , ostatnia chwila może być 23:59.59.999999999
( nanosekundowa ). Zamiast dzielić włosy, myśl tylko w pierwszej chwili, a nie w ostatniej chwili.
W Half-Open dzień rozpoczyna się od pierwszej chwili jednego dnia i idzie w górę, ale nie obejmuje pierwszej chwili następnego dnia. Zamiast myśleć w ten sposób:
… Od dzisiaj o 00:00 (północ wcześnie rano) do 12:00 (północ dziś wieczorem).
… Pomyśl tak…
od pierwszego momentu dzisiejszego dnia do pierwszego dnia jutra, ale nie wliczając pierwszego:
(> = 00:00:00.0
dzisiaj ORAZ < 00:00:00.0
jutro)
W pracy bazy danych, podejście to znaczy nie za pomocą BETWEEN
operatora w SQL.
Początek dnia
Co więcej, pierwsza chwila dnia nie zawsze jest porą dnia 00:00:00.0
. Czas letni (DST) w niektórych strefach czasowych i ewentualnie inne anomalie mogą oznaczać, że o innej porze zaczyna się dzień.
Niech klasy java.time wykonają zadanie określające początek dnia za pomocą wywołania LocalDate::atStartOfDay( ZoneId )
. Musimy więc objechać LocalDate
i wrócić do, ZonedDateTime
jak widać w tym przykładowym kodzie.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Zwróć uwagę na opcjonalne ZoneId
. Jeśli zostanie pominięty, domyślna strefa czasowa JVM zostanie zastosowana domyślnie. Lepiej być wyraźnym.
Strefa czasowa ma kluczowe znaczenie dla pracy z datą i godziną. Pytanie i niektóre inne odpowiedzi są potencjalnie wadliwe, ponieważ nie świadomie obsługują strefę czasową.
Konwertować
Jeśli musisz użyć java.util.Date lub .Calendar, poszukaj nowych metod konwersji dodanych do tych starych klas.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Przedział czasu
Nawiasem mówiąc, jeśli wykonujesz dużo pracy z upływem czasu, spójrz na:
Duration
Period
Interval
Interval
Klasa znajduje się w ThreeTen-Extra projektu przedłużenia do ram java.time. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
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 .