Java Tutorial #26

Date-Time-API in Java

2022-01-15 | credits: Zffoto/ adobe

Das Erstellen von Datum und Zeit wurde mit Java 8 komplett neu designed. Mit den neuen Klassen der Java Date- und Time-API, die durch das Paket java.time repräsentiert ist, wird es sehr simpel, eigene Datums- und Zeitobjekte zu erstellen.

Die Klasse LocalDate

Das Erstellen von Datum und Zeit wurde mit Java 8 komplett neu designed. Mit den neuen Klassen der Java Date- und Time-API, die durch das Paket java.time repräsentiert ist, wird es sehr simpel, eigene Datums- und Zeitobjekte zu erstellen. 

Fangen wir mit der Klasse LocalDate an. 

Datum erstellen

Ein LocalDate-Objekt können wir mit der Methode now() erstellen. Als Ergebnis erhalten wir eine Repräsentation des heutigen Datums:

LocalDateTime heute = LocalDateTime.now();
System.out.println(heute); // z.B. 2022-01-11  

Natürlich lässt sich auch ein ganz beliebiges Datum frei erstellen. Hierzu kannst du die LocalDate-Methode of() verwenden:

LocalDate date = LocalDate.of(2020, 8, 20);
System.out.println(date); // 2020-08-20

Alternativ zu int-Werten lässt sich ein Datum auch mit ENUMS erstellen:

LocalDate birthday = LocalDate.of(1998, Month.JANUARY, 1);   

Auch das Parsen eines Strings ist mit of() möglich:

LocalDate date2 = LocalDate.parse("2020-08-20");
System.out.println(date2); // 2020-08-20               

plusDays, plusWeeks, plusMonths, plusYears 

Die LocalDate-Methoden plusDays(), plusWeeks(), plusMonths() und plusYears() fügen, wie der Name schon sagt, einem Datum eine entsprechende Menge hinzu. Weil LocalDate ein unveränderbares (immutable) Objekt ist, kann ein einmal festgeleftes Datum nicht mehr geändert werden. Deshalb wird als Ergebnis ein neues Datum-Objekt zurückgeliefert. Testen wir das mal:

LocalDate date3 = LocalDate.of(2022, 1, 1);

LocalDate dateD = date3.plusDays(1);
LocalDate dateW = date3.plusWeeks(1);
LocalDate dateM = date3.plusMonths(1);
LocalDate dateY = date3.plusYears(1);
System.out.println(dateD); // 2022-01-10
System.out.println(dateW); // 2022-01-08
System.out.println(dateM); // 2022-02-01
System.out.println(dateY); // 2023-01-01  

LocalDate-Objekte vergleichen

isAfter, isBefore, isEqual 

Mit den Methoden isAfter(), isBefore() und isEqual() können wir zwei LocalDate-Objekte nach chronologischer Reihenfolge miteinander vergleichen. Die Methoden nehmen jeweils einen Parameter entgegen, der mit dem Referenz-Objekt vergleichen wird. Als Ergebnis wird ein boolescher Wert zurückgeliefert. Ist ganz easy:

LocalDate datum1 = LocalDate.of(2022, 10, 20);
LocalDate datum2 = LocalDate.of(2023, 11, 12);

System.out.println(datum1.isBefore(datum2)); // true
System.out.println(datum1.isAfter(datum2));  // false
System.out.println(datum1.isEqual(datum2));  // false

Periode ermitteln mit until

Es ist auch möglich, die Zeitspanne zu ermitteln, die zwischen zwei Datumsangaben liegt. Hierzu gibt es zum Beispiel die Methode until(), die als Ergebnis ein Period-Objekt zurückliefert. Ein Period-Objekt speichert eine Zeitspanne und kann nach Jahr, Monat, Tag abgefragt werden:

LocalDate datumX = LocalDate.of(2022, 10, 20);
Period period = datumX.until(LocalDate.of(2031, 11, 9));
System.out.println(period.getYears());  // 9
System.out.println(period.getMonths()); // 0
System.out.println(period.getDays());   // 20  

Summe aller Tage in einer Periode 

Um eine Menge aller Tage von einer Periode zurückgeliefert zu bekommen, benutzt du einfach die Methode ChronoUnit.DAYS.between.

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1998, Month.JANUARY, 1);
long p = ChronoUnit.DAYS.between(birthday, today);
System.out.println(p); // z.B. 8777  

Datum formatieren

Super praktisch ist die Klasse DateTimeFormatter mit der wir unseren LocalDate Ausgabe-String nach unseren Bedürfnissen hin formatieren können. 

Hier ein Beispiel ohne und mit Formatierung:

// ohne Formatierung
LocalDateTime myDateObj = LocalDateTime.now();
System.out.println(myDateObj); // 2022-01-13T20:30:24.089694

// mit Formatierung
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd. MMMM yyyy");
String formattedDate = myDateObj.format(myFormatObj);
System.out.println(formattedDate); // 13. Januar 2022   

Das Ganze läuft so ab: Wir legen zunächst einmal mit der Methode DateTimeFormatter.ofPattern() das gewünschte Format-Muster fest. Die Zeichen d - M - y werden innerhalb des Musters von Java als Tag, Monat und Jahr erkannt. Zum Beispiel: 

- MMMM schreibt im Datum den Monat voll aus (Januar, Februar etc.)

- MMM schreibt den Monat in Kurzform (Jan, Feb etc.)

- MM nimmt die Monatsnummer mit führender Null (01, 02 etc.)

- M nimmt die Monatsnummer ohne führende Null (1, 2 etc.)

LocalTime

Wir haben mit LocalDate bislang nur die Klasse für ein Datum kennengelernt. Das ist natürlich nicht die einzige temporale Klasse. 

LocalTime etwa repräsentiert eine reine Zeitangabe ("Uhr"), standardmäßig gezeigt im Format Stunde-Minute-Sekunde-Nanosekunde. Zum Beispiel:

System.out.println(LocalTime.now()); // 20:50:17.534992 

Eine spezifische Zeit lässt sich (auch ohne Nanosekunden) mit der Methode of() generieren:

LocalTime time2 = LocalTime.of(7, 20, 45);
System.out.println(time2); // 07:20:45 

Das folgende Beispiel splittet ein LocalTime-Objekt in Stunde, Minute und Sekunde:

LocalTime time = LocalTime.now();

System.out.println("Stunde: " + time.getHour());
System.out.println("Minute: " + time.getMinute());
System.out.println("Sekunde: " + time.getSecond());   

LocalDateTime

Eine Art "Mischung" zwischen LocalDate und LocalTime ist die Klasse LocalDateTime. Ein LocalDateTime-Objekt speichert nämlich sowohl das Datum als auch die Zeit:

LocalDateTime jetzt = LocalDateTime.now();
System.out.println(jetzt); // 2022-01-13T21:55:21.991166
Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen