1. ZonedDateTimeklasse

Er is nog een zeer interessante klasse in de Date Time API: de ZonedDateTimeklasse. Het belangrijkste doel is om het handig te maken om met datums in verschillende tijdzones te werken.

LocalDateis geweldig voor het weergeven van datums. Bijvoorbeeld verjaardagen. Mijn verjaardag is 15 maart, waar ik ook ben. Dit is een voorbeeld van een datum.

LocalTimeis geweldig om tijd te beschrijven, zoals de tijd die is ingesteld op een wekker: ik zet de wekker op 05:00 uur en het maakt niet uit waar ik ben. 5:00 uur is 5:00 uur. Dit is een voorbeeld van werken met tijd.

Laten we nu zeggen dat we een applicatie schrijven die vluchten boekt. Vliegtuigen vertrekken en arriveren op basis van de lokale tijd. Het vliegtuig is voor een vaste tijd in de lucht, maar de tijdzones kunnen veranderen.

Tijdzones

Trouwens, tijdzones zijn een echte puinhoop. En als je denkt dat er 24 tijdzones zijn, dan vergis je je enorm.

De tijd in India verschilt bijvoorbeeld vijf en een half uur van Greenwich Mean Time: GMT+5:30. Sommige landen schakelen over op zomertijd, andere niet. Bovendien schakelen verschillende landen op verschillende tijden van het jaar over naar de zomertijd.

En sommige landen nemen wetten aan die de zomertijd annuleren, opnieuw invoeren of opnieuw annuleren.

Hoe dan ook, de wereld heeft tijdzones en binnen elke tijdzone is er één tijd. De tijd in verschillende zones kan in bepaalde periodes van het jaar samenvallen en in andere periodes verschillen. Tijdzones worden meestal genoemd naar de grote steden die zich daarin bevinden: Europe/Monaco, Asia/Singapore, maar er zijn ook uitzonderingen — US/Pacific.

Officieel zijn er op dit moment 599 tijdzones. Denk er eens over na: 599. Dat is verre van 24. Welkom in de globale wereld.

De ZoneIdklasse uit het java.timepakket wordt gebruikt om een ​​tijdzone in Java op te slaan.

Het heeft trouwens een statische getAvailableZoneIds()methode, die de set van alle momenteel bekende tijdzones retourneert. Om een ​​lijst van alle zones te krijgen, moet u de volgende code schrijven:

Code Console-uitvoer (gedeeltelijk)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Om een ​​object bij zijn naam te krijgen , moet u de statische methode ZoneIdgebruiken ;of()

Code Opmerking
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Een ZonedDateTimeobject maken

Wanneer u een object maakt , moet u de statische methode ZonedDateTimevan de klasse aanroepen en er een object aan doorgeven.now()ZoneId

Code Console-uitvoer
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]

Als je geen ZoneIdobject doorgeeft aan de now()methode (en dat mag), dan wordt de tijdzone automatisch bepaald op basis van de instellingen van de computer waarop het programma draait.

Voorbeeld:

Code Console-uitvoer
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

Een globale datum omzetten in een lokale

Een van de interessante kenmerken van ZonedDateTimeis de mogelijkheid om te converteren naar een lokale datum en tijd. Voorbeeld:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Werken met de tijd

Net als de LocalDateTimeklas heeft de ZonedDateTimeklas veel manieren om individuele elementen van een datum en tijd te krijgen. Hier is een lijst van deze methoden:

int getYear()
Retourneert het jaar van een specifieke datum
Month getMonth()
Retourneert de maand van de datum: een van meerdere constanten —JANUARY, FEBRUARY, ...;
int getMonthValue()
Retourneert de index van de maand van de datum. januari == 1
int getDayOfMonth()
Retourneert de index van de dag van de maand
DayOfWeek getDayOfWeek()
Retourneert de dag van de week: een van meerdere constanten —MONDAY, TUESDAY, ...;
int getDayOfYear()
Retourneert de index van de dag van het jaar
int getHour()
Retourneert de uren
int getMinute()
Retourneert de minuten
int getSecond()
Retourneert de seconden
int getNano()
Retourneert de nanoseconden

Alle methoden zijn perfect analoog aan de methoden van de LocalDateTimeklasse. En natuurlijk ZonedDateTimeheeft de klas methoden waarmee je met datums en tijden kunt werken. Dat gezegd hebbende, verandert het object waarop de methoden worden aangeroepen niet. In plaats daarvan retourneren ze een nieuw ZonedDateTimeobject:

methoden Beschrijving
plusYears(int)
Voegt jaren toe aan de datum
plusMonths(int)
Voegt maanden toe aan de datum
plusDays(int)
Voegt dagen toe aan de datum
plusHours(int)
Voegt uren toe
plusMinutes(int)
Voegt minuten toe
plusSeconds(int)
Voegt seconden toe
plusNanos(int)
Voegt nanoseconden toe
minusYears(int)
Trekt jaren af ​​van de datum
minusMonths(int)
Trekt maanden af ​​van de datum
minusDays(int)
Trekt dagen af ​​van de datum
minusHours(int)
Trekt uren af
minusMinutes(int)
Trekt minuten af
minusSeconds(int)
Trekt seconden af
minusNanos(int)
Trekt nanoseconden af

We zullen geen voorbeelden geven, omdat we denken dat alles hier duidelijk is naar analogie van de klassen die we zojuist hebben overwogen.