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/Singapore
choć 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 ZoneId
z 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ęść) |
---|---|
|
|
Aby uzyskać obiekt ZoneId
według jego nazwy, musisz użyć metody static of()
;
Kod | Notatka |
---|---|
|
|
2. Utwórz obiektZonedDateTime
Podczas tworzenia obiektu ZonedDateTime
należy wywołać jego metodę statyczną now()
i przekazać do niego obiekt ZoneId
.
Kod | Wyjście na wyświetlaczu |
---|---|
|
|
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 |
---|---|
|
|
Konwertuj datę globalną na datę lokalną
Ciekawą funkcją ZonedDateTime
jest 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 ZonedDateTime
ma wiele sposobów na uzyskanie poszczególnych fragmentów daty i godziny. Oto lista tych metod:
|
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 dzień tygodnia: jedną ze stałych specjalnychMONDAY, TUESDAY, ...; |
|
Zwraca numer dnia w roku |
|
Zwraca zegar |
|
Zwraca minuty |
|
Zwraca sekundy |
|
Zwraca nanosekundy |
Wszystkie metody są całkowicie podobne do metod LocalDateTime
. I oczywiście klasa ZonedDateTime
ma 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 |
---|---|
|
Dodaje lata do daty |
|
Dodaje miesiące do daty |
|
Dodaje dni do daty |
|
Dodaje zegar |
|
Dodaje minuty |
|
Dodaje sekundy |
|
Dodaje nanosekundy |
|
Odejmuje lata od daty |
|
Odejmuje miesiące od daty |
|
Odejmuje dni od daty |
|
Odejmij godziny |
|
Odejmuje minuty |
|
Odejmuje sekundy |
|
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.
GO TO FULL VERSION