1. Wprowadzenie do API Date Time

Wprowadzenie do interfejsu API daty i godziny

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
LocalDate today = LocalDate.now();
System.out.println("Сегодня = " + today);

Сегодня = 2019-02-22

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
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("Teraz в Шанхае = " + today);


Teraz в Шанхае = 2019-02-22

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
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Сегодня = " + today);

Сегодня = 2019-02-22

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
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Сегодня = " + today);

Сегодня = 2019-04-10

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
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Сегодня = " + today);

Сегодня = 1970-01-02

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
int getYear()
Zwraca rok od określonej daty
Month getMonth()
Zwraca miesiąc daty, jedną ze stałych specjalnych
JANUARY, FEBRUARY, ...;
int getMonthValue()
Zwraca numer miesiąca z daty. Styczeń == 1.
int getDayOfMonth()
Zwraca numer dnia w miesiącu
int getDayOfYear()
Zwraca numer dnia od początku roku
DayOfWeek getDayOfWeek()
Zwraca dzień tygodnia: jedną ze stałych specjalnych
MONDAY, TUESDAY, ...;
IsoEra getEra()
Zwraca epokę: stała BC(przed obecną erą) i CE(bieżąca era)

Przykład:

Kod Wyjście na wyświetlaczu
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Dodaje określoną liczbę dni do daty
plusWeeks(int weeks)
Dodaje tygodnie do daty
plusMonths(int months)
Dodaje miesiące do daty
plusYears(int years)
Dodaje lata do daty
minusDays(int days)
Odejmuje dni od daty
minusWeeks(int weeks)
Odejmuje tygodnie od daty
minusMonths(int months)
Odejmuje miesiące od daty
minusYears(int years)
Odejmuje lata od daty

Przykład:

Kod Wyjście na wyświetlaczu
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Obiekt birthday, którego metody wywołujemy, nie zmienia się. Zamiast tego jego metody zwracają nowe obiekty, które zawierają żądane dane.