Jetzt anmelden...

Login
Passwort
Registrieren
15.01.22 570 Views Kommentare [0] 1 0

credit: Zffoto/ adobe

Java Tutorial #25

Date-Time-API in Java

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.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

// heutiges Datum:
LocalDate heute = LocalDate.now();

// beliebiges Datum
LocalDate datum = LocalDate.of(2020, 1, 8);

// Uhrzeit inkl. Nanosekunden
LocalTime zeit = LocalTime.now();

// Datum formatieren:
LocalDate dateF = LocalDate.of(2021, 8, 9);
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd-MM-yyyy");
System.out.println(dateF.format(format)); // 09-08-2021

    Inhaltsverzeichnis

  1. Datum: LocalDate
  2. LocalDate-Objekte vergleichen
  3. Datum formatieren
  4. Zeit: LocalTime
  5. Datum und Zeit: LocalDateTime

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

Falconbyte unterstützen

Kommentar schreiben

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Objekte löschen

Wir wissen, wie wir Objekte erstellen können. Aber wie werden wir sie wieder los?

Objektsammlungen

Lernen Sie in diesem Kapitel, wie Sie eine Sammlung von Objekten erstellen können.

Der Konstruktor

Was ist eigentlich ein Konstruktor?

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2021 Stefan E. Heller

Impressum | Datenschutz

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen