Date
Kurz: Datums-/Zeitwerte in Java abbilden — heute über das moderne java.time-Package (LocalDate, LocalDateTime), die alte Klasse java.util.Date gilt seit Java 8 als veraltet.
Genauer: java.util.Date hatte grundlegende Designprobleme (u. a. veränderlich/mutable, verwirrende Monatszählung ab 0) — java.time.LocalDate/LocalDateTime sind unveränderlich (immutable) und deutlich weniger fehleranfällig. Für Datumsberechnungen (z. B. “in 7 Tagen”) bietet java.time eigene Methoden wie plusDays(7).
Im Detail
LocalDate heute = LocalDate.now();
LocalDate geburtstag = LocalDate.of(2026, 12, 24);
LocalDate inEinerWoche = heute.plusDays(7); // liefert ein NEUES Objekt, heute bleibt unverändert!
Period alter = Period.between(geburtstag, heute);
System.out.println(alter.getYears() + " Jahre");
LocalDateTime zeitstempel = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
System.out.println(zeitstempel.format(formatter)); // z.B. "17.09.2026 14:30"Weil LocalDate/LocalDateTime/Period unveränderlich (immutable) sind, verändert heute.plusDays(7) das Objekt heute NICHT — es liefert ein komplett neues Objekt zurück. Ein häufiger Fehler ist, das Ergebnis zu ignorieren (heute.plusDays(7); ohne Zuweisung) und sich zu wundern, warum heute unverändert bleibt. Für Zeitzonen-bewusste Zeitstempel gibt es zusätzlich ZonedDateTime bzw. Instant (für einen reinen UTC-Zeitpunkt ohne Zeitzoneninfo, typisch für Server-Timestamps).
Die drei zentralen Klassen im Überblick
LocalDate speichert nur ein Datum ohne Uhrzeit (2026-12-24), LocalTime nur eine Uhrzeit ohne Datum (14:30:00), LocalDateTime kombiniert beides. Keine der drei Klassen kennt eine Zeitzone — für zeitzonenbewusste Zeitstempel (z. B. “24.12.2026, 14:30 Uhr Berliner Zeit”) gibt es ZonedDateTime:
ZonedDateTime berlin = ZonedDateTime.now(ZoneId.of("Europe/Berlin"));
ZonedDateTime newYork = berlin.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(berlin); // z.B. 2026-09-17T14:30+02:00[Europe/Berlin]
System.out.println(newYork); // derselbe Zeitpunkt, andere Zeitzone dargestelltWarum java.util.Date als veraltet gilt
Die alte Klasse java.util.Date (aus den ersten Java-Versionen) hatte mehrere fundamentale Designfehler: Objekte waren veränderlich (mutable), was in nebenläufigem Code zu subtilen Bugs führen konnte, die Monatszählung begann bei 0 (Januar = Monat 0), und viele Methoden waren bereits seit Java 1.1 als “deprecated” markiert, blieben aber aus Kompatibilitätsgründen nutzbar. java.time (auch bekannt als JSR-310, eingeführt in Java 8) wurde bewusst als kompletter Neuentwurf konzipiert, stark inspiriert von der beliebten Drittanbieter-Bibliothek Joda-Time.
Parsen und Formatieren
Datumswerte aus Nutzereingaben oder Dateien liegen meist als Text vor und müssen geparst werden — dabei kann derselbe DateTimeFormatter sowohl fürs Formatieren als auch fürs Parsen genutzt werden:
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM.yyyy");
LocalDate datum = LocalDate.parse("24.12.2026", f);Ein häufiger Laufzeitfehler ist ein DateTimeParseException, wenn das Eingabeformat nicht exakt zum definierten Pattern passt (z. B. Eingabe "24-12-2026" bei einem Pattern, das Punkte erwartet).
Vergleich und Sortierung
LocalDate/LocalDateTime implementieren Comparable, lassen sich also direkt vergleichen und sortieren, ohne eigenen Vergleichscode zu schreiben:
LocalDate a = LocalDate.of(2026, 1, 1);
LocalDate b = LocalDate.of(2026, 6, 1);
System.out.println(a.isBefore(b)); // true
System.out.println(a.compareTo(b)); // negativer Wert, da a vor b liegt
List<LocalDate> termine = new ArrayList<>(List.of(b, a));
Collections.sort(termine); // nutzt automatisch compareTo()isBefore()/isAfter()/isEqual() sind dabei oft lesbarer als ein rohes compareTo() < 0, besonders in Bedingungen wie if (heute.isAfter(deadline)).
Siehe auch: Errors, Non-primitive Types