tl; dr
doradzać w zakresie bieżącej „najlepszej praktyki” wokół Date
iCalendar
jest to najlepiej zawsze faworyzują Calendar
ponadDate
Unikaj całkowicie tych klas starszych . Zamiast tego użyj klas java.time .
Detale
Odpowiedz przez Ortomala Lokni słusznie sugerują, stosując nowoczesne java.time klas zamiast kłopotliwych starych klas legacy-czasowych (data Date
, Calendar
itd). Ale ta odpowiedź sugeruje, że niewłaściwa klasa jest równoważna (patrz mój komentarz do tej odpowiedzi).
Korzystanie z java.time
Klasy java.time to znaczna poprawa w stosunku do starszych klas data-godzina, różnica między dniem i nocą. Stare klasy są źle zaprojektowane, zagmatwane i kłopotliwe. W miarę możliwości powinieneś unikać starych klas. Ale kiedy musisz przekonwertować na / ze starej / nowej, możesz to zrobić, wywołując nowe metody add do starych klas.
Aby uzyskać więcej informacji na temat konwersji, zobacz mój Odpowiedź i sprytny diagram na inne pytanie. Konwertuj java.util.Date na jaki typ „java.time”? .
Przeszukiwanie stosu przepełnienia daje wiele setek przykładowych pytań i odpowiedzi na temat korzystania z java.time. Ale tutaj jest krótkie streszczenie.
Instant
Uzyskaj aktualny moment dzięki Instant
. Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund (do dziewięciu (9) cyfr ułamka dziesiętnego).
Instant instant = Instant.now();
ZonedDateTime
Aby zobaczyć ten sam jednoczesny moment przez soczewkę zegara ściennego z określonego regionu , zastosuj strefę czasową ( ZoneId
), aby uzyskać ZonedDateTime
.
Strefa czasowa
Określ prawidłową nazwę strefy czasowej w formacie continent/region
, takie jak America/Montreal
, Africa/Casablanca
lub Pacific/Auckland
. Nigdy nie używaj 3-4 literowego skrótu, takiego jak EST
lub, IST
ponieważ nie są to prawdziwe strefy czasowe, nie są znormalizowane, a nawet unikalne (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Offsetowy
Strefa czasowa to historia zmian regionu w przesunięciu względem UTC . Ale czasami dostajesz tylko przesunięcie bez pełnej strefy. W takim przypadku użyj OffsetDateTime
klasy.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Użycie strefy czasowej jest lepsze niż zwykłe przesunięcie.
LocalDateTime
„Lokalny” w Local…
klasach oznacza dowolną lokalizację, a nie określoną lokalizację. Więc nazwa może być sprzeczna z intuicją.
LocalDateTime
, LocalDate
i LocalTime
celowo brakuje jakichkolwiek informacji o przesunięciu lub strefie czasowej. Więc oni nie reprezentują rzeczywistych momentów, są one nie punkty na osi czasu. W razie wątpliwości lub zamieszania użyj ZonedDateTime
raczej niż LocalDateTime
. Przeszukaj stos przepełnienia, aby uzyskać więcej dyskusji.
Smyczki
Nie należy łączyć obiektów daty i godziny z łańcuchami reprezentującymi ich wartość. Możesz przeanalizować ciąg, aby uzyskać obiekt daty i godziny, i możesz wygenerować ciąg z obiektu daty i godziny. Ale ciąg nigdy nie jest samą datą i godziną.
Dowiedz się o standardowych formatach ISO 8601 , używanych domyślnie w klasach java.time.
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 .
Korzystając ze sterownika JDBC zgodnego z JDBC 4.2 lub nowszym, możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Nie potrzeba ciągów ani klas java.sql. *.
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 .