1. ZonedDateTimeklasse

Der er en anden meget interessant klasse i Date Time API: klassen ZonedDateTime. Dens hovedformål er at gøre det praktisk at arbejde med datoer i forskellige tidszoner.

LocalDateer fantastisk til at repræsentere datoer. For eksempel fødselsdage. Jeg har fødselsdag den 15. marts, uanset hvor jeg er. Dette er et eksempel på en dato.

LocalTimeer fantastisk til at beskrive tid, som tiden indstillet på et vækkeur: Jeg indstiller vækkeuret til 5:00 om morgenen, og det er lige meget, hvor jeg er. 5:00 er 5:00. Dette er et eksempel på at arbejde med tid.

Lad os nu sige, at vi skriver en applikation, der reserverer flyrejser. Fly letter og ankommer baseret på lokal tid. Flyet er i luften i et fast tidsrum, men tidszonerne kan ændre sig.

Tidszoner

Tidszoner er i øvrigt et rigtig rod. Og hvis du tror, ​​at der er 24 tidszoner, tager du meget fejl.

For eksempel afviger tiden i Indien fra Greenwich Mean Time med fem en halv time: GMT+5:30. Nogle lande skifter til sommertid, og andre gør ikke. Desuden skifter forskellige lande til sommertid på forskellige tidspunkter af året.

Og nogle lande vedtager love, der annullerer sommertid, genindfører den eller annullerer den igen.

Under alle omstændigheder har verden tidszoner, og inden for hver tidszone er der én tid. Tiden i forskellige zoner kan falde sammen i visse perioder af året og derefter variere i andre perioder. Tidszoner er normalt opkaldt efter større byer i dem: Europe/Monaco, Asia/Singapore, men der er også undtagelser — US/Pacific.

Officielt er der 599 tidszoner i øjeblikket. Tænk over det: 599. Det er langt fra 24. Velkommen til den globale verden.

Klassen ZoneIdfra java.timepakken bruges til at gemme en tidszone i Java.

Forresten har den en statisk getAvailableZoneIds()metode, som returnerer sættet af alle aktuelt kendte tidszoner. For at få en liste over alle zoner skal du skrive følgende kode:

Kode Konsoludgang (delvis)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

For at få et ZoneIdobjekt ved dets navn, skal du bruge den statiske of()metode;

Kode Bemærk
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Oprettelse af et ZonedDateTimeobjekt

Når du opretter et ZonedDateTimeobjekt, skal du kalde klassens statiske now()metode og sende et ZoneIdobjekt til det.

Kode Konsoludgang
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]

Hvis du ikke sender et ZoneIdobjekt til now()metoden (og det er tilladt), så bestemmes tidszonen automatisk baseret på indstillingerne på den computer, der kører programmet.

Eksempel:

Kode Konsoludgang
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

Konvertering af en global dato til en lokal

Et af de interessante træk ved ZonedDateTimeer dets evne til at konvertere til en lokal dato og tid. Eksempel:

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

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

3. At arbejde med tiden

Ligesom LocalDateTimeklassen ZonedDateTimehar klassen masser af måder at få individuelle elementer af en dato og tid på. Her er en liste over disse metoder:

int getYear()
Returnerer året for en bestemt dato
Month getMonth()
Returnerer datoens måned: en af ​​flere konstanter —JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerer indekset for datoens måned. januar == 1
int getDayOfMonth()
Returnerer indekset for dagen i måneden
DayOfWeek getDayOfWeek()
Returnerer ugedagen: en af ​​flere konstanter —MONDAY, TUESDAY, ...;
int getDayOfYear()
Returnerer indekset for årets dag
int getHour()
Returnerer timerne
int getMinute()
Returnerer minutterne
int getSecond()
Returnerer sekunderne
int getNano()
Returnerer nanosekunderne

Alle metoderne er fuldstændig analoge med klassens metoder LocalDateTime. Og klassen har selvfølgelig ZonedDateTimemetoder, der lader dig arbejde med datoer og tidspunkter. Når det er sagt, ændres det objekt, som metoderne kaldes på, ikke. I stedet returnerer de et nyt ZonedDateTimeobjekt:

Metoder Beskrivelse
plusYears(int)
Tilføjer år til datoen
plusMonths(int)
Tilføjer måneder til datoen
plusDays(int)
Tilføjer dage til datoen
plusHours(int)
Tilføjer timer
plusMinutes(int)
Tilføjer minutter
plusSeconds(int)
Tilføjer sekunder
plusNanos(int)
Tilføjer nanosekunder
minusYears(int)
Trækker år fra datoen
minusMonths(int)
Trækker måneder fra dato
minusDays(int)
Trækker dage fra datoen
minusHours(int)
Trækker timer fra
minusMinutes(int)
Trækker minutter fra
minusSeconds(int)
Trækker sekunder fra
minusNanos(int)
Trækker nanosekunder fra

Vi vil ikke give nogle eksempler, da vi mener, at alt her er klart i analogi med de klasser, vi lige har overvejet.