1. Introductie van de Date Time API
De makers van Java hielden niet van de situatie met de klassen Datum en Kalender. Ze waren goed in hun tijd, maar tijden veranderen. En iets eenvoudigs, krachtigs en betrouwbaars werd noodzakelijk. En met de release van Java 8 (15 jaar na Calendar
verschijnen) werd de Java Date Time API geïntroduceerd. Het is een reeks klassen die elke mogelijke taak die met tijd te maken heeft, moet kunnen oplossen.
Er waren zoveel klassen dat ze in verschillende pakketten werden opgesplitst:
Het java.time
pakket is het basispakket voor de Java Date Time API: het bevat klassen zoals LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
, en Duration
. Alle objecten van deze klassen zijn immutable
, wat betekent dat ze na creatie niet kunnen worden gewijzigd.
Het java.time.format
pakket bevat klassen voor tijdopmaak, dwz het converteren van tijden (en datums) naar strings en vice versa. Het bevat bijvoorbeeld de veelzijdige DateTimeFormatter
klasse, die de SimpleDateFormat
klasse vervangt.
Het java.time.zone
pakket bevat lessen voor het werken met tijdzones. Het bevat klassen zoals TimeZone
en ZonedDateTime
. Als je servercode schrijft voor clients die zich in verschillende delen van de wereld bevinden, heb je deze klassen echt nodig.
2. LocalDate
klasse
De eerste en meest bruikbare klasse van de Date Time API waar we naar zullen kijken, is de LocalDate
klasse. Zoals je waarschijnlijk al kunt raden aan de hand van de naam, is deze klasse ontworpen om met datums te werken.
Objecten van deze klasse veranderen niet nadat ze zijn gemaakt, dwz de LocalDate
klasse is onveranderlijk. Maar deze eigenschap voegt eenvoud en betrouwbaarheid toe aan de klas. Vooral als meerdere threads (uitvoeringsthreads) tegelijkertijd met een dergelijk object in wisselwerking staan.
Om een nieuw LocalDate
object te maken, moet u een van de statische methoden gebruiken. Hier is een lijst met de belangrijkste.
De huidige datum ophalen
now()
Om de huidige datum te krijgen, moet u de statische methode gebruiken . Dit is veel makkelijker dan het lijkt:
LocalDate today = LocalDate.now();
Waar today
is een LocalDate
variabele en LocalDate.now()
is een aanroep naar de statische now()
methode van de LocalDate
klasse.
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
Een datum krijgen in een specifieke tijdzone
De LocalDate
klas heeft ook een variatie op de now(ZoneId)
methode waarmee je de huidige datum in een specifieke tijdzone kunt krijgen.
Om dit te doen, hebben we een andere klasse nodig: de ZoneId
klasse (java.time.ZoneId). Het heeft een of()
methode die een ZoneId
object retourneert met de naam van de tijdzone.
Om de huidige datum in Shanghai te bepalen, moet u de volgende code schrijven:
Code | Console-uitvoer |
---|---|
|
|
Op internet vindt u een lijst met de namen van alle tijdzones.
3. Een specifieke datum krijgen
Om een object te krijgen dat een specifieke datum vertegenwoordigt, moet u de statische methode LocalDate
gebruiken . of()
Alles is hier ook heel eenvoudig en duidelijk:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Waar date
is een LocalDate
variabele en is een aanroep naar de statische methode van de klasse.LocalDate.of()
of()
LocalDate
Hier zien we de FEBRUARY
constante van de Month
klasse (java.time.Month) die wordt gebruikt om februari als maand te specificeren.
U kunt de maand ook op de ouderwetse manier specificeren - met behulp van een nummer:
LocalDate date = LocalDate.of(2019, 2, 22);
Twee? In plaats van februari? Betekent dit dat de maanden weer van één worden geteld?
Ja, bijna 20 jaar na de creatie van Java worden maanden eindelijk niet meer vanaf nul genummerd.
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
Een datum krijgen door de index van de dag
Er is nog een interessante manier om een datum te maken: met behulp van de ofYearDay
methode kun je een datum krijgen die alleen is gebaseerd op het nummer van het jaar en de index van de dag in het jaar. Hier is het algemene uiterlijk:
LocalDate date = LocalDate.ofYearDay(year, day);
Waar year
is het nummer van het jaar en day
is de index van de dag in het jaar.
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
De 100e dag van 2019 is 10 april.
Een Unix-datum krijgen
Herinner je je dat Date
objecten sinds 1 januari 1970 altijd tijd opsloegen als het aantal milliseconden? Om ervoor te zorgen dat programmeurs de goede oude tijd niet zouden missen, heeft de LocalDate
klas een ofEpochDay()
methode gekregen die de datum retourneert die is berekend vanaf 1 januari 1970. Dit is het algemene uiterlijk:
LocalDate date = LocalDate.ofEpochDay(day);
Waar day
is het aantal dagen dat is verstreken sinds 1 januari 1970.
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
4. Elementen van een date krijgen
Het is onmogelijk om LocalDate
objecten te wijzigen, maar u kunt wel individuele elementen van de opgeslagen datum krijgen. LocalDate
objecten hebben hiervoor verschillende methoden:
Methode | Beschrijving |
---|---|
|
Retourneert het jaar van een specifieke datum |
|
Retourneert de maand van de datum: een van meerdere constantenJANUARY, FEBRUARY, ...; |
|
Retourneert de index van de maand van de datum. januari == 1. |
|
Retourneert de index van de dag van de maand |
|
Retourneert de dagindex vanaf het begin van het jaar |
|
Retourneert de dag van de week: een van meerdere constantenMONDAY, TUESDAY, ...; |
|
Retourneert het tijdperk: ofwel BCE (Before Current Era) of CE (Current Era) |
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
LocalDate
5. De datum in een object wijzigen
De LocalDate
klasse bevat verschillende methoden waarmee u met datums kunt werken. De implementatie van deze methoden is analoog aan de methoden van de String
klasse: ze wijzigen het bestaande LocalDate
object niet, maar retourneren in plaats daarvan een nieuw object met de gewenste gegevens.
Dit zijn de methodes van de LocalDate
klasse:
Methode | Beschrijving |
---|---|
|
Voegt een opgegeven aantal dagen toe aan de datum |
|
Voegt weken toe aan de datum |
|
Voegt maanden toe aan de datum |
|
Voegt jaren toe aan de datum |
|
Trekt dagen af van de datum |
|
Trekt weken af van de datum |
|
Trekt maanden af van de datum |
|
Trekt jaren af van de datum |
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
De birthday object
wiens methoden we noemen, verandert niet. In plaats daarvan retourneren de methoden nieuwe objecten die de gewenste gegevens bevatten.