1. ZonedDateTime
klasse
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.
LocalDate
er 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.
LocalTime
er 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 ZoneId
fra java.time
pakken 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 at få et ZoneId
objekt ved dets navn, skal du bruge den statiske of()
metode;
Kode | Bemærk |
---|---|
|
|
2. Oprettelse af et ZonedDateTime
objekt
Når du opretter et ZonedDateTime
objekt, skal du kalde klassens statiske now()
metode og sende et ZoneId
objekt til det.
Kode | Konsoludgang |
---|---|
|
|
Hvis du ikke sender et ZoneId
objekt til now()
metoden (og det er tilladt), så bestemmes tidszonen automatisk baseret på indstillingerne på den computer, der kører programmet.
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
Konvertering af en global dato til en lokal
Et af de interessante træk ved ZonedDateTime
er 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 LocalDateTime
klassen ZonedDateTime
har klassen masser af måder at få individuelle elementer af en dato og tid på. Her er en liste over disse metoder:
|
Returnerer året for en bestemt dato |
|
Returnerer datoens måned: en af flere konstanter —JANUARY, FEBRUARY, ...; |
|
Returnerer indekset for datoens måned. januar == 1 |
|
Returnerer indekset for dagen i måneden |
|
Returnerer ugedagen: en af flere konstanter —MONDAY, TUESDAY, ...; |
|
Returnerer indekset for årets dag |
|
Returnerer timerne |
|
Returnerer minutterne |
|
Returnerer sekunderne |
|
Returnerer nanosekunderne |
Alle metoderne er fuldstændig analoge med klassens metoder LocalDateTime
. Og klassen har selvfølgelig ZonedDateTime
metoder, 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 ZonedDateTime
objekt:
Metoder | Beskrivelse |
---|---|
|
Tilføjer år til datoen |
|
Tilføjer måneder til datoen |
|
Tilføjer dage til datoen |
|
Tilføjer timer |
|
Tilføjer minutter |
|
Tilføjer sekunder |
|
Tilføjer nanosekunder |
|
Trækker år fra datoen |
|
Trækker måneder fra dato |
|
Trækker dage fra datoen |
|
Trækker timer fra |
|
Trækker minutter fra |
|
Trækker sekunder fra |
|
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.
GO TO FULL VERSION