1. Einführung der Date Time API

Einführung der Date Time API

Den Entwicklern von Java gefiel die Situation mit den Klassen „Datum“ und „Kalender“ nicht. Sie waren zu ihrer Zeit gut, aber die Zeiten ändern sich. Und etwas Einfaches, Kraftvolles und Zuverlässiges wurde notwendig. Und mit der Veröffentlichung von Java 8 (15 Jahre nach Calendardem Erscheinen) wurde die Java Date Time API eingeführt. Dabei handelt es sich um eine Reihe von Klassen, die in der Lage sein sollen, jede mögliche Aufgabe im Zusammenhang mit der Zeit zu lösen.

Es gab so viele Klassen, dass sie in mehrere Pakete aufgeteilt wurden:

Das java.timePaket ist das Basispaket für die Java Date Time API: Es enthält Klassen wie LocalDate, LocalTime, LocalDateTime, Instant, Periodund Duration. Alle Objekte dieser Klassen sind immutable, d. h. sie können nach der Erstellung nicht mehr geändert werden.

Das java.time.formatPaket enthält Klassen zur Zeitformatierung, also zur Konvertierung von Zeiten (und Datumsangaben) in Strings und umgekehrt. Es enthält beispielsweise die DateTimeFormatterKlasse „Vielseitig“, die die Klasse ersetzt SimpleDateFormat.

Das java.time.zonePaket enthält Klassen für die Arbeit mit Zeitzonen. Es enthält Klassen wie TimeZoneund ZonedDateTime. Wenn Sie Servercode für Clients schreiben, die sich in verschiedenen Teilen der Welt befinden, benötigen Sie diese Klassen unbedingt.


2. LocalDateKlasse

Die erste und nützlichste Klasse der Date Time API, die wir uns ansehen werden, ist die LocalDateKlasse. Wie Sie wahrscheinlich anhand des Namens erraten können, ist diese Klasse für die Arbeit mit Datumsangaben konzipiert.

Objekte dieser Klasse ändern sich nach ihrer Erstellung nicht, dh die LocalDateKlasse ist unveränderlich. Aber diese Eigenschaft verleiht der Klasse Einfachheit und Zuverlässigkeit. Insbesondere wenn mehrere Threads (Ausführungsthreads) gleichzeitig mit einem solchen Objekt interagieren.

Um ein neues LocalDateObjekt zu erstellen, müssen Sie eine der statischen Methoden verwenden. Hier ist eine Liste der wichtigsten.

Aktuelles Datum abrufen

Um das aktuelle Datum zu erhalten, müssen Sie die statische now()Methode verwenden. Das ist viel einfacher als es scheint:

LocalDate today = LocalDate.now();

Wo todayist eine LocalDateVariable und LocalDate.now()ein Aufruf der statischen now()Methode der LocalDateKlasse.

Beispiel:

Code Konsolenausgabe
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Ein Datum in einer bestimmten Zeitzone abrufen

Die LocalDateKlasse verfügt außerdem über eine Variation der now(ZoneId)Methode, mit der Sie das aktuelle Datum in einer bestimmten Zeitzone abrufen können.

Dazu benötigen wir eine weitere Klasse – die ZoneIdKlasse (java.time.ZoneId). Es verfügt über eine Methode, die ein Objekt mit dem Namen der Zeitzone of()zurückgibt .ZoneId

Um das aktuelle Datum in Shanghai zu ermitteln, müssen Sie den folgenden Code schreiben:

Code Konsolenausgabe
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Eine Liste mit den Namen aller Zeitzonen finden Sie im Internet.


3. Ein bestimmtes Datum erhalten

Um ein Objekt zu erhalten , das ein bestimmtes Datum darstellt, müssen Sie die statische Methode LocalDateverwenden . of()Auch hier ist alles ganz einfach und klar:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Wo dateist eine LocalDateVariable und ein Aufruf der statischen Methode der Klasse.LocalDate.of()of()LocalDate

Hier sehen wir die FEBRUARYKonstante der MonthKlasse (java.time.Month), die verwendet wird, um Februar als Monat anzugeben.

Sie können den Monat auch auf altmodische Weise angeben – mit einer Zahl:

LocalDate date = LocalDate.of(2019, 2, 22);

Zwei? Statt Februar? Bedeutet das, dass die Monate wieder von eins an gezählt werden?

Ja, fast 20 Jahre nach der Entwicklung von Java werden Monate endlich nicht mehr von Null an gezählt.

Beispiel:

Code Konsolenausgabe
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Ein Datum anhand des Tagesindex ermitteln

Es gibt noch eine weitere interessante Möglichkeit, ein Datum zu erstellen: Mit dieser ofYearDayMethode können Sie ein Datum erhalten, das nur auf der Jahreszahl und dem Index des Tages im Jahr basiert. Hier ist das allgemeine Erscheinungsbild:

LocalDate date = LocalDate.ofYearDay(year, day);

Dabei yearist die Zahl des Jahres und dayder Index des Tages im Jahr.

Beispiel:

Code Konsolenausgabe
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Der 100. Tag des Jahres 2019 ist der 10. April.

Einen Unix-Termin bekommen

Erinnern Sie sich, dass DateObjekte seit dem 1. Januar 1970 die Zeit immer als Anzahl der Millisekunden gespeichert haben? Um sicherzustellen, dass Programmierer die guten alten Zeiten nicht verpassen, LocalDateerhielt die Klasse eine ofEpochDay()Methode, die das vom 1. Januar 1970 berechnete Datum zurückgibt. Hier ist das allgemeine Erscheinungsbild:

LocalDate date = LocalDate.ofEpochDay(day);

Wo dayist die Anzahl der Tage, die seit dem 1. Januar 1970 vergangen sind?

Beispiel:

Code Konsolenausgabe
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Elemente eines Datums abrufen

Es ist nicht möglich, Objekte zu ändern LocalDate, aber Sie können einzelne Elemente des gespeicherten Datums abrufen. LocalDateObjekte verfügen hierfür über mehrere Methoden:

Methode Beschreibung
int getYear()
Gibt das Jahr eines bestimmten Datums zurück
Month getMonth()
Gibt den Monat des Datums zurück: eine von mehreren Konstanten
JANUARY, FEBRUARY, ...;
int getMonthValue()
Gibt den Index des Monats des Datums zurück. Januar == 1.
int getDayOfMonth()
Gibt den Index des Tages des Monats zurück
int getDayOfYear()
Gibt den Tagesindex vom Jahresanfang zurück
DayOfWeek getDayOfWeek()
Gibt den Wochentag zurück: eine von mehreren Konstanten
MONDAY, TUESDAY, ...;
IsoEra getEra()
Gibt die Ära zurück: entweder BCE(Vor der aktuellen Ära) und CE(Aktuelle Ära)

Beispiel:

Code Konsolenausgabe
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

5. Ändern des Datums in einem LocalDateObjekt

Die LocalDateKlasse enthält mehrere Methoden, mit denen Sie mit Datumsangaben arbeiten können. Die Implementierung dieser Methoden erfolgt analog zu den Methoden der StringKlasse: Sie verändern nicht das bestehende LocalDateObjekt, sondern geben ein neues mit den gewünschten Daten zurück.

Hier sind die Methoden der LocalDateKlasse:

Methode Beschreibung
plusDays(int days)
Fügt dem Datum eine angegebene Anzahl von Tagen hinzu
plusWeeks(int weeks)
Fügt dem Datum Wochen hinzu
plusMonths(int months)
Fügt dem Datum Monate hinzu
plusYears(int years)
Fügt dem Datum Jahre hinzu
minusDays(int days)
Subtrahiert Tage vom Datum
minusWeeks(int weeks)
Subtrahiert Wochen vom Datum
minusMonths(int months)
Subtrahiert Monate vom Datum
minusYears(int years)
Subtrahiert Jahre vom Datum

Beispiel:

Code Konsolenausgabe
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

Die birthday objectwessen Methoden, die wir aufrufen, ändern sich nicht. Stattdessen geben seine Methoden neue Objekte zurück, die die gewünschten Daten enthalten.