1. ZonedDateTimeklass

Det finns en annan mycket intressant klass i Date Time API: ZonedDateTimeklassen. 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/Monacomen Asia/Singaporedet 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 ZoneIdfrån java.timepaketet 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)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

För att få ett ZoneIdobjekt med dess namn måste du använda den statiska of()metoden;

Koda Notera
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Skapa ett ZonedDateTimeobjekt

När du skapar ett ZonedDateTimeobjekt måste du anropa klassens statiska now()metod och skicka ett ZoneIdobjekt till den.

Koda Konsolutgång
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]

Om du inte skickar ett ZoneIdobjekt 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
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

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 LocalDateTimeklassen ZonedDateTimehar klassen många sätt att få individuella delar av ett datum och en tid. Här är en lista över dessa metoder:

int getYear()
Returnerar året för ett visst datum
Month getMonth()
Returnerar datumets månad: en av flera konstanter —JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerar index för datumets månad. januari == 1
int getDayOfMonth()
Returnerar index för dagen i månaden
DayOfWeek getDayOfWeek()
Returnerar veckodagen: en av flera konstanter —MONDAY, TUESDAY, ...;
int getDayOfYear()
Returnerar index för dagen på året
int getHour()
Returnerar timmarna
int getMinute()
Returnerar minuterna
int getSecond()
Returnerar sekunderna
int getNano()
Returnerar nanosekunderna

Alla metoder är helt analoga med klassens metoder LocalDateTime. Och naturligtvis ZonedDateTimehar 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 ZonedDateTimeobjekt:

Metoder Beskrivning
plusYears(int)
Lägger till år till datumet
plusMonths(int)
Lägger till månader till datumet
plusDays(int)
Lägger till dagar till datumet
plusHours(int)
Lägger till timmar
plusMinutes(int)
Lägger till minuter
plusSeconds(int)
Lägger till sekunder
plusNanos(int)
Lägger till nanosekunder
minusYears(int)
Subtraherar år från datumet
minusMonths(int)
Subtraherar månader från datum
minusDays(int)
Subtraherar dagar från datumet
minusHours(int)
Subtraherar timmar
minusMinutes(int)
Subtraherar minuter
minusSeconds(int)
Subtraherar sekunder
minusNanos(int)
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.