1. Introductie van de Date Time API

Introductie van de Datum Tijd 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
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

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
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

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
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

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
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

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
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

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
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
int getDayOfYear()
Retourneert de dagindex vanaf het begin van het jaar
DayOfWeek getDayOfWeek()
Retourneert de dag van de week: een van meerdere constanten
MONDAY, TUESDAY, ...;
IsoEra getEra()
Retourneert het tijdperk: ofwel BCE(Before Current Era) of CE(Current Era)

Voorbeeld:

Code Console-uitvoer
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Voegt een opgegeven aantal dagen toe aan de datum
plusWeeks(int weeks)
Voegt weken toe aan de datum
plusMonths(int months)
Voegt maanden toe aan de datum
plusYears(int years)
Voegt jaren toe aan de datum
minusDays(int days)
Trekt dagen af ​​van de datum
minusWeeks(int weeks)
Trekt weken af ​​van de datum
minusMonths(int months)
Trekt maanden af ​​van de datum
minusYears(int years)
Trekt jaren af ​​van de datum

Voorbeeld:

Code Console-uitvoer
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

De birthday objectwiens methoden we noemen, verandert niet. In plaats daarvan retourneren de methoden nieuwe objecten die de gewenste gegevens bevatten.