1. ZonedDateTime
klass
Det finns en annan mycket intressant klass i Date Time API: ZonedDateTime
klassen. Dess huvudsakliga syfte är att göra det bekvämt att arbeta med datum i olika tidszoner.
LocalDate
är bra för att representera datum. Till exempel födelsedagar. Jag fyller år den 15 mars oavsett var jag är. Detta är ett exempel på ett datum.
LocalTime
är bra att beskriva tid, som tiden som är inställd på en väckarklocka: jag ställer in alarmet på 05:00 och det spelar ingen roll var jag är. 5:00 är 5:00. Det här är ett exempel på att arbeta med tid.
Låt oss nu säga att vi skriver en applikation som bokar flyg. Plan lyfter och anländer baserat på lokal tid. Planet är i luften under en bestämd tid, men tidszonerna kan ändras.
Tidszoner
Förresten, tidszoner är en riktig röra. Och om du tror att det finns 24 tidszoner, har du stor fel.
Till exempel skiljer sig tiden i Indien från Greenwich Mean Time med fem och en halv timme: GMT+5:30
. Vissa länder byter till sommartid och andra inte. Dessutom byter olika länder till sommartid vid olika tider på året.
Och vissa länder stiftar lagar som avbryter sommartid, eller återinför den eller avbryter den igen.
I vilket fall som helst har världen tidszoner, och inom varje tidszon finns det en tid. Tiden i olika zoner kan sammanfalla under vissa perioder på året och sedan skilja sig under andra perioder. Tidszoner är vanligtvis uppkallade efter större städer som ligger i dem: , , Europe/Monaco
men Asia/Singapore
det finns också undantag — US/Pacific
.
Officiellt finns det 599 tidszoner för tillfället. Tänk på det: 599. Det är långt ifrån 24. Välkommen till den globala världen.
Klassen ZoneId
från java.time
paketet används för att lagra en tidszon i Java.
Förresten, den har en statisk getAvailableZoneIds()
metod, som returnerar uppsättningen av alla för närvarande kända tidszoner. För att få en lista över alla zoner måste du skriva följande kod:
Koda | Konsolutgång (delvis) |
---|---|
|
|
För att få ett ZoneId
objekt med dess namn måste du använda den statiska of()
metoden;
Koda | Notera |
---|---|
|
|
2. Skapa ett ZonedDateTime
objekt
När du skapar ett ZonedDateTime
objekt måste du anropa klassens statiska now()
metod och skicka ett ZoneId
objekt till den.
Koda | Konsolutgång |
---|---|
|
|
Om du inte skickar ett ZoneId
objekt till now()
metoden (och det är tillåtet) så bestäms tidszonen automatiskt baserat på inställningarna på datorn som kör programmet.
Exempel:
Koda | Konsolutgång |
---|---|
|
|
Konvertera ett globalt datum till ett lokalt
En av de intressanta funktionerna ZonedDateTime
är dess förmåga att konvertera till ett lokalt datum och tid. Exempel:
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);
LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();
3. Arbeta med tiden
Liksom LocalDateTime
klassen ZonedDateTime
har klassen många sätt att få individuella delar av ett datum och en tid. Här är en lista över dessa metoder:
|
Returnerar året för ett visst datum |
|
Returnerar datumets månad: en av flera konstanter —JANUARY, FEBRUARY, ...; |
|
Returnerar index för datumets månad. januari == 1 |
|
Returnerar index för dagen i månaden |
|
Returnerar veckodagen: en av flera konstanter —MONDAY, TUESDAY, ...; |
|
Returnerar index för dagen på året |
|
Returnerar timmarna |
|
Returnerar minuterna |
|
Returnerar sekunderna |
|
Returnerar nanosekunderna |
Alla metoder är helt analoga med klassens metoder LocalDateTime
. Och naturligtvis ZonedDateTime
har klassen metoder som låter dig arbeta med datum och tider. Som sagt, objektet som metoderna anropas på ändras inte. Istället returnerar de ett nytt ZonedDateTime
objekt:
Metoder | Beskrivning |
---|---|
|
Lägger till år till datumet |
|
Lägger till månader till datumet |
|
Lägger till dagar till datumet |
|
Lägger till timmar |
|
Lägger till minuter |
|
Lägger till sekunder |
|
Lägger till nanosekunder |
|
Subtraherar år från datumet |
|
Subtraherar månader från datum |
|
Subtraherar dagar från datumet |
|
Subtraherar timmar |
|
Subtraherar minuter |
|
Subtraherar sekunder |
|
Subtraherar nanosekunder |
Vi kommer inte att ge några exempel, eftersom vi tror att allt här är tydligt i analogi med de klasser vi just övervägde.
GO TO FULL VERSION