1. ZonedDateTimeklasse

Det er en annen veldig interessant klasse i Date Time API: klassen ZonedDateTime. Hovedformålet er å gjøre det praktisk å jobbe med datoer i forskjellige tidssoner.

LocalDateer flott for å representere datoer. For eksempel bursdager. Jeg har bursdag 15. mars uansett hvor jeg er. Dette er et eksempel på en date.

LocalTimeer flott å beskrive tid, som tiden satt på en vekkerklokke: Jeg setter vekkerklokken til 05:00 og det spiller ingen rolle hvor jeg er. 05:00 er 05:00. Dette er et eksempel på å jobbe med tid.

La oss nå si at vi skriver en applikasjon som bestiller flyreiser. Fly tar av og ankommer basert på lokal tid. Flyet er i luften for en fast tid, men tidssonene kan endres.

Tidssoner

Tidssoner er forresten et skikkelig rot. Og hvis du tror at det er 24 tidssoner, tar du veldig feil.

For eksempel er tiden i India forskjellig fra Greenwich Mean Time med fem og en halv time: GMT+5:30. Noen land går over til sommertid, og andre gjør det ikke. Dessuten bytter forskjellige land til sommertid på forskjellige tider av året.

Og noen land vedtar lover som kansellerer sommertid, eller gjeninnfører den, eller avbryter den igjen.

Uansett har verden tidssoner, og innenfor hver tidssone er det én tid. Tid i ulike soner kan falle sammen i visse perioder av året, og deretter variere i andre perioder. Tidssoner er vanligvis oppkalt etter større byer som ligger i dem: Europe/Monaco, Asia/Singapore, men det finnes også unntak — US/Pacific.

Offisielt er det 599 tidssoner for øyeblikket. Tenk på det: 599. Det er langt fra 24. Velkommen til den globale verden.

Klassen ZoneIdfra java.timepakken brukes til å lagre en tidssone i Java.

Den har forresten en statisk getAvailableZoneIds()metode, som returnerer settet med alle kjente tidssoner. For å få en liste over alle soner, må du skrive følgende kode:

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

For å få et ZoneIdobjekt ved navn, må du bruke den statiske of()metoden;

Kode Merk
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Opprette et ZonedDateTimeobjekt

Når du oppretter et ZonedDateTimeobjekt, må du kalle klassens statiske now()metode og sende et ZoneIdobjekt til den.

Kode Konsollutgang
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 tillatt), bestemmes tidssonen automatisk basert på innstillingene til datamaskinen som kjører programmet.

Eksempel:

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

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

Konvertering av en global dato til en lokal

En av de interessante egenskapene til ZonedDateTimeer dens evne til å konvertere til en lokal dato og klokkeslett. 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. Arbeid med tid

I likhet med LocalDateTimeklassen ZonedDateTimehar klassen mange måter å få individuelle elementer av en dato og et klokkeslett på. Her er en liste over disse metodene:

int getYear()
Returnerer året for en bestemt dato
Month getMonth()
Returnerer datoens måned: en av flere konstanter —JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerer indeksen for datoens måned. januar == 1
int getDayOfMonth()
Returnerer indeksen for dagen i måneden
DayOfWeek getDayOfWeek()
Returnerer ukedagen: en av flere konstanter —MONDAY, TUESDAY, ...;
int getDayOfYear()
Returnerer indeksen for dagen i året
int getHour()
Returnerer timene
int getMinute()
Returnerer minuttene
int getSecond()
Returnerer sekundene
int getNano()
Returnerer nanosekunder

Alle metodene er helt analoge med metodene i klassen LocalDateTime. Og selvfølgelig ZonedDateTimehar klassen metoder som lar deg jobbe med datoer og klokkeslett. Når det er sagt, endres ikke objektet som metodene kalles. I stedet returnerer de et nytt ZonedDateTimeobjekt:

Metoder Beskrivelse
plusYears(int)
Legger år til datoen
plusMonths(int)
Legger til måneder til datoen
plusDays(int)
Legger til dager til datoen
plusHours(int)
Legger til timer
plusMinutes(int)
Legger til minutter
plusSeconds(int)
Legger til sekunder
plusNanos(int)
Legger til nanosekunder
minusYears(int)
Trekker år fra datoen
minusMonths(int)
Trekker måneder fra dato
minusDays(int)
Trekker dager fra datoen
minusHours(int)
Trekker fra timer
minusMinutes(int)
Trekker fra minutter
minusSeconds(int)
Trekker fra sekunder
minusNanos(int)
Trekker fra nanosekunder

Vi vil ikke gi noen eksempler, siden vi tror alt her er klart i analogi med klassene vi nettopp vurderte.