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 Calendarverschijnen) 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.timepakket 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.formatpakket bevat klassen voor tijdopmaak, dwz het converteren van tijden (en datums) naar strings en vice versa. Het bevat bijvoorbeeld de veelzijdige DateTimeFormatterklasse, die de SimpleDateFormatklasse vervangt.
Het java.time.zonepakket bevat lessen voor het werken met tijdzones. Het bevat klassen zoals TimeZoneen ZonedDateTime. Als je servercode schrijft voor clients die zich in verschillende delen van de wereld bevinden, heb je deze klassen echt nodig.
2. LocalDateklasse
De eerste en meest bruikbare klasse van de Date Time API waar we naar zullen kijken, is de LocalDateklasse. 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 LocalDateklasse 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 LocalDateobject 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 todayis een LocalDatevariabele en LocalDate.now()is een aanroep naar de statische now()methode van de LocalDateklasse.
Voorbeeld:
| Code | Console-uitvoer |
|---|---|
|
|
Een datum krijgen in een specifieke tijdzone
De LocalDateklas 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 ZoneIdklasse (java.time.ZoneId). Het heeft een of()methode die een ZoneIdobject 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 LocalDategebruiken . of()Alles is hier ook heel eenvoudig en duidelijk:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Waar dateis een LocalDatevariabele en is een aanroep naar de statische methode van de klasse.LocalDate.of()of()LocalDate
Hier zien we de FEBRUARYconstante van de Monthklasse (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 ofYearDaymethode 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 yearis het nummer van het jaar en dayis 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 Dateobjecten 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 LocalDateklas 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 dayis het aantal dagen dat is verstreken sinds 1 januari 1970.
Voorbeeld:
| Code | Console-uitvoer |
|---|---|
|
|
4. Elementen van een date krijgen
Het is onmogelijk om LocalDateobjecten te wijzigen, maar u kunt wel individuele elementen van de opgeslagen datum krijgen. LocalDateobjecten 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 |
|---|---|
|
|
LocalDate5. De datum in een object wijzigen
De LocalDateklasse bevat verschillende methoden waarmee u met datums kunt werken. De implementatie van deze methoden is analoog aan de methoden van de Stringklasse: ze wijzigen het bestaande LocalDateobject niet, maar retourneren in plaats daarvan een nieuw object met de gewenste gegevens.
Dit zijn de methodes van de LocalDateklasse:
| 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 objectwiens methoden we noemen, verandert niet. In plaats daarvan retourneren de methoden nieuwe objecten die de gewenste gegevens bevatten.
GO TO FULL VERSION