1 klasaZonedDateTime

Jest jeszcze jedna bardzo interesująca klasa w API Date Time, ZonedDateTime. Jego głównym celem jest wygodna praca z datami w różnych strefach czasowych.

LocalDateświetnie nadaje się do opisywania dat. Na przykład urodziny: moje urodziny są 15 marca bez względu na to, gdzie jestem. To jest przykład randki.

LocalTimeświetnie nadaje się do opisywania czasu, na przykład budzika: nastawiam budzik na 5 rano i nie ma znaczenia, gdzie jestem. 5 rano to 5 rano. To jest przykład pracy z czasem.

Załóżmy teraz, że piszemy aplikację, która rezerwuje loty. Samoloty startują i przylatują o czasie lokalnym, samolot leci o stałej godzinie, ale zmieniają się strefy czasowe.

Strefy czasowe

Nawiasem mówiąc, ze strefami czasowymi (strefami czasowymi) na świecie prawdziwy bałagan. Co więcej, jeśli myślisz, że istnieją 24 strefy czasowe, bardzo się mylisz.

Na przykład czas w Indiach różni się od czasu Greenwich o 5 i pół godziny: GMT+5:30. Niektóre kraje przechodzą na czas letni, inne nie. Co więcej, różne kraje przechodzą na czas letni w różnych porach roku.

A niektóre kraje, za pomocą przepisów, anulują przejście na czas letni lub przywracają go lub ponownie anulują.

Generalnie na świecie są strefy czasowe, w obrębie każdej strefy jest jeden czas. Czas w różnych strefach może pokrywać się w niektórych okresach roku i różnić w innych okresach. Nazwy stref na ogół pochodzą od znajdujących się w nich głównych miast: Europe/Monaco,, Asia/Singaporechoć zdarzają się wyjątki - US/Pacific.

W sumie obecnie oficjalnie znanych jest 599 stref czasowych. Pomyśl o tym: 599. To wcale nie jest 24. Witamy w globalnym świecie.

Java używa klasy ZoneIdz java.time.

Nawiasem mówiąc, ma metodę statyczną getAvailableZoneIds(), która zwraca zestaw wszystkich obecnie znanych stref czasowych. Aby uzyskać listę wszystkich stref, musisz napisać następujący kod:

Kod Wyjście ekranu (część)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Aby uzyskać obiekt ZoneIdwedług jego nazwy, musisz użyć metody static of();

Kod Notatka
ZoneId zone = ZoneId.of("Africa/Cairo");
Каир


2. Utwórz obiektZonedDateTime

Podczas tworzenia obiektu ZonedDateTimenależy wywołać jego metodę statyczną now()i przekazać do niego obiekt ZoneId.

Kod Wyjście na wyświetlaczu
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Jeśli now()nie przekażesz obiektu metodzie ZoneId, co jest możliwe, strefa czasowa zostanie ustalona automatycznie: na podstawie ustawień komputera, na którym uruchomiony jest program.

Przykład:

Kod Wyjście na wyświetlaczu
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Konwertuj datę globalną na datę lokalną

Ciekawą funkcją ZonedDateTimejest możliwość przekonwertowania go na lokalną datę i godzinę. Przykład.

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Praca z czasem

Podobnie jak klasa LocalDateTime, klasa ZonedDateTimema wiele sposobów na uzyskanie poszczególnych fragmentów daty i godziny. Oto lista tych metod:

int getYear()
Zwraca rok od określonej daty
Month getMonth()
Zwraca miesiąc daty: jedną ze stałych specjalnychJANUARY, FEBRUARY, ...;
int getMonthValue()
Zwraca numer miesiąca z daty. Styczeń == 1
int getDayOfMonth()
Zwraca numer dnia w miesiącu
DayOfWeek getDayOfWeek()
Zwraca dzień tygodnia: jedną ze stałych specjalnychMONDAY, TUESDAY, ...;
int getDayOfYear()
Zwraca numer dnia w roku
int getHour()
Zwraca zegar
int getMinute()
Zwraca minuty
int getSecond()
Zwraca sekundy
int getNano()
Zwraca nanosekundy

Wszystkie metody są całkowicie podobne do metod LocalDateTime. I oczywiście klasa ZonedDateTimema metody, które pozwalają pracować z datami i godzinami. Jednocześnie obiekt, na którym wywoływane są metody, nie zmienia się: zamiast tego metody zwracają nowy obiekt ZonedDateTime:

Metody Opis
plusYears(int)
Dodaje lata do daty
plusMonths(int)
Dodaje miesiące do daty
plusDays(int)
Dodaje dni do daty
plusHours(int)
Dodaje zegar
plusMinutes(int)
Dodaje minuty
plusSeconds(int)
Dodaje sekundy
plusNanos(int)
Dodaje nanosekundy
minusYears(int)
Odejmuje lata od daty
minusMonths(int)
Odejmuje miesiące od daty
minusDays(int)
Odejmuje dni od daty
minusHours(int)
Odejmij godziny
minusMinutes(int)
Odejmuje minuty
minusSeconds(int)
Odejmuje sekundy
minusNanos(int)
Odejmuje nanosekundy

Nie będziemy podawać przykładów: uważamy, że i tak wszystko jest tutaj jasne przez analogię do rozważanych przed chwilą klas.