1. ZonedDateTime
klasse
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.
LocalDate
er flott for å representere datoer. For eksempel bursdager. Jeg har bursdag 15. mars uansett hvor jeg er. Dette er et eksempel på en date.
LocalTime
er 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 ZoneId
fra java.time
pakken 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 å få et ZoneId
objekt ved navn, må du bruke den statiske of()
metoden;
Kode | Merk |
---|---|
|
|
2. Opprette et ZonedDateTime
objekt
Når du oppretter et ZonedDateTime
objekt, må du kalle klassens statiske now()
metode og sende et ZoneId
objekt til den.
Kode | Konsollutgang |
---|---|
|
|
Hvis du ikke sender et ZoneId
objekt til now()
metoden (og det er tillatt), bestemmes tidssonen automatisk basert på innstillingene til datamaskinen som kjører programmet.
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Konvertering av en global dato til en lokal
En av de interessante egenskapene til ZonedDateTime
er 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 LocalDateTime
klassen ZonedDateTime
har klassen mange måter å få individuelle elementer av en dato og et klokkeslett på. Her er en liste over disse metodene:
|
Returnerer året for en bestemt dato |
|
Returnerer datoens måned: en av flere konstanter —JANUARY, FEBRUARY, ...; |
|
Returnerer indeksen for datoens måned. januar == 1 |
|
Returnerer indeksen for dagen i måneden |
|
Returnerer ukedagen: en av flere konstanter —MONDAY, TUESDAY, ...; |
|
Returnerer indeksen for dagen i året |
|
Returnerer timene |
|
Returnerer minuttene |
|
Returnerer sekundene |
|
Returnerer nanosekunder |
Alle metodene er helt analoge med metodene i klassen LocalDateTime
. Og selvfølgelig ZonedDateTime
har 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 ZonedDateTime
objekt:
Metoder | Beskrivelse |
---|---|
|
Legger år til datoen |
|
Legger til måneder til datoen |
|
Legger til dager til datoen |
|
Legger til timer |
|
Legger til minutter |
|
Legger til sekunder |
|
Legger til nanosekunder |
|
Trekker år fra datoen |
|
Trekker måneder fra dato |
|
Trekker dager fra datoen |
|
Trekker fra timer |
|
Trekker fra minutter |
|
Trekker fra sekunder |
|
Trekker fra nanosekunder |
Vi vil ikke gi noen eksempler, siden vi tror alt her er klart i analogi med klassene vi nettopp vurderte.