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 å få et ZoneIdobjekt ved navn, må du bruke den statiske of()metoden;
| Kode | Merk |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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:
|
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 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 |
|---|---|
|
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.
GO TO FULL VERSION