1. Wprowadzenie do API Date Time

Twórcom Javy nie spodobała się obecna sytuacja z klasami Date i Calendar. W swoim czasie byli dobrzy, ale czasy się zmieniają. Potrzebowaliśmy czegoś prostego, wydajnego i niezawodnego. A teraz, wraz z wydaniem Java8 (15 lat po wydaniu ), Calendarwprowadzono Java Date Time API : zestaw klas, które powinny rozwiązać wszystkie możliwe problemy z czasem.
Zajęć było tak dużo, że postanowili podzielić je na kilka pakietów:
Pakiet java.timejest pakietem podstawowym dla Java Date Time API: zawiera klasy takie jak LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration. Wszystkie obiekty tych klas to immutable: nie można ich zmienić po utworzeniu.
Pakiet java.time.formatzawiera klasy do formatowania czasu: konwersji czasu (i daty) na ciąg tekstowy i odwrotnie. Na przykład zawiera klasę ogólną, taką jak DateTimeFormatter, która zastąpiła SimpleDateFormat.
Pakiet java.time.zonezawiera klasy do pracy ze strefami czasowymi (strefy czasowe). Zawiera klasy takie TimeZonejak ZonedDateTime. Jeśli piszesz kod dla serwera, którego klienci znajdują się w różnych częściach świata, te klasy będą Ci bardzo potrzebne.
2. KlasaLocalDate
Pierwszą i najbardziej użyteczną klasą z interfejsu Date Time API, której się przyjrzymy, jest klasa LocalDate. Jak można się domyślić po nazwie, ta klasa jest przeznaczona do pracy z datami.
Obiekty tej klasy nie zmieniają się po utworzeniu (klasa LocalDatejest niezmienna). Ale dodał do klasy prostotę i niezawodność. Zwłaszcza jeśli kilka wątków (wątków wykonania) oddziałuje jednocześnie z obiektem klasy.
Aby utworzyć nowy obiekt klasy LocalDate, musisz użyć jednej ze statycznych metod. Oto lista głównych.
Pobieranie bieżącej daty
Aby uzyskać aktualną datę, musisz użyć metody statycznej now(). To o wiele łatwiejsze niż się wydaje:
LocalDate today = LocalDate.now();
Gdzie todayjest zmienną klasy LocalDatei LocalDate.now()jest wywołaniem metody statycznej now()w klasie LocalDate.
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
Uzyskanie daty w określonej strefie czasowej
Klasa LocalDateposiada również swego rodzaju metodę now(ZoneId), która pozwala uzyskać aktualną datę w określonej strefie czasowej.
Aby to zrobić, potrzebujemy innej klasy - ZoneId(java.time.ZoneId). Posiada metodę of(), która zwraca obiekt ZoneIdwedług nazwy strefy czasowej.
Aby ustalić aktualną datę w Szanghaju, należy wpisać kod:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
Listę nazw wszystkich stref czasowych (strefy czasowej) można znaleźć w Internecie.
3. Uzyskanie konkretnej daty
Aby otrzymać obiekt LocalDatezawierający określoną datę, należy użyć metody statycznej of(). Wszystko wygląda również bardzo prosto i przejrzyście:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Gdzie datejest zmienną klasy LocalDatei jest wywołaniem metody statycznej w klasie .LocalDate.of()of()LocalDate
Również tutaj widzimy użycie specjalnej stałej FEBRUARYklasowej Month(java.time.Month) do ustawienia miesiąca lutego.
Możesz ustawić miesiąc w staromodny sposób - używając liczby:
LocalDate date = LocalDate.of(2019, 2, 22);
Licho? Zamiast miesiąca lutego? Czy chodzi o to, że miesiące są teraz znowu policzone od jednego?
Tak, prawie 20 lat po stworzeniu Javy, miesiące wreszcie przestały być liczone od zera.
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
Uzyskaj datę po numerze dnia
Istnieje jeszcze jedna interesująca metoda tworzenia daty: za pomocą tej metody ofYearDaymożna uzyskać datę podając tylko numer roku i numer dnia w roku. Ogólny pogląd jest taki:
LocalDate date = LocalDate.ofYearDay(год, день);
Gdzie rok to numer roku, a dzień to numer dnia w roku.
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
100. dzień 2019 roku to 10 kwietnia.
Uzyskiwanie daty uniksowej
Pamiętasz, że obiekty klasy Datezawsze przechowywały czas w milisekundach od 1 stycznia 1970 roku? Aby programiści nie przegapili starych dobrych czasów, do klasy LocalDatedodano metodę ofEpochDay(), która zwraca datę liczoną od 1 stycznia 1970 roku. Ogólny pogląd jest taki:
LocalDate date = LocalDate.ofEpochDay(день);
Gdzie деньjest liczba dni od 1 stycznia 1970 r.
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
4. Pozyskiwanie fragmentów daty
Nie możesz zmienić obiektów klas LocalDate, ale nadal możesz uzyskać oddzielne fragmenty dat. Aby to zrobić, obiekty klasy LocalDatemają kilka metod:
| metoda | Opis |
|---|---|
|
Zwraca rok od określonej daty |
|
Zwraca miesiąc daty, jedną ze stałych specjalnychJANUARY, FEBRUARY, ...; |
|
Zwraca numer miesiąca z daty. Styczeń == 1. |
|
Zwraca numer dnia w miesiącu |
|
Zwraca numer dnia od początku roku |
|
Zwraca dzień tygodnia: jedną ze stałych specjalnychMONDAY, TUESDAY, ...; |
|
Zwraca epokę: stała BC(przed obecną erą) i CE(bieżąca era) |
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
5. Zmień datę w obiekcieLocalDate
Klasa LocalDatezawiera kilka metod, które umożliwiają pracę z datami. Metody te są implementowane podobnie jak metody klasowe String: każda z tych metod nie zmienia istniejącego obiektu LocalDate, lecz zwraca nowy z wymaganymi danymi.
Oto metody klasy LocalDate:
| metoda | Opis |
|---|---|
|
Dodaje określoną liczbę dni do daty |
|
Dodaje tygodnie do daty |
|
Dodaje miesiące do daty |
|
Dodaje lata do daty |
|
Odejmuje dni od daty |
|
Odejmuje tygodnie od daty |
|
Odejmuje miesiące od daty |
|
Odejmuje lata od daty |
Przykład:
| Kod | Wyjście na wyświetlaczu |
|---|---|
|
|
Obiekt birthday, którego metody wywołujemy, nie zmienia się. Zamiast tego jego metody zwracają nowe obiekty, które zawierają żądane dane.
GO TO FULL VERSION