Java LocalDate erklärt: Vollständiger Leitfaden zur Datumsverarbeitung in Java 8 und später

目次

Was ist LocalDate?

Die Datumsverarbeitung in Java hat sich seit Version 8 erheblich weiterentwickelt. Im Mittelpunkt dieser Entwicklung steht LocalDate. LocalDate ist ein unveränderliches Objekt, das nur ein Datum (Jahr, Monat und Tag, z. B. 2025-06-26) repräsentiert, ohne irgendeinen Zeit‑ oder Zeitzonenbezug. Es ermöglicht Ihnen, das heutige Datum oder bestimmte Kalendertage auf einfache und sichere Weise zu handhaben.

Unterschiede zu den alten Datums‑Klassen

Vor Java 8 wurden Klassen wie java.util.Date und java.util.Calendar häufig verwendet. Diese Klassen wiesen jedoch mehrere Probleme auf, darunter fehleranfälliges Design (z. B. nullbasierte Monate), fehlende Thread‑Sicherheit und unintuitive APIs. Infolgedessen führten sie oft zu Bugs oder unerwartetem Verhalten.

LocalDate löst diese Probleme und bietet die folgenden Merkmale:

  • Explizite Verwaltung von Jahr, Monat und Tag nur (z. B. 26. Juni 2025)
  • Unveränderliches Objekt (Werte können nicht geändert werden, was Sicherheit gewährleistet)
  • Intuitive Methodennamen und API‑Design (z. B. plusDays(1) für den nächsten Tag, getMonthValue() für die Monatszahl)
  • Zeitzonenunabhängig (konsequentes Verhalten unabhängig von System‑ oder Servereinstellungen)

Wann sollten Sie LocalDate verwenden?

LocalDate ist ideal, wenn Sie Daten klar handhaben wollen, keine Zeitinformationen benötigen und Datumsoperationen sicher und einfach implementieren möchten. Typische Anwendungsfälle sind:

  • Aufzeichnung von Daten ohne Zeit, z. B. Geburtstage oder Jubiläen
  • Verwaltung von Zeitplänen, Fristen und Fälligkeitsterminen
  • Berechnung von Fristen oder verbleibenden Tagen

Aus diesen Gründen kann LocalDate als neuer Standard für die Datumsverarbeitung in Java angesehen werden. Im nächsten Abschnitt erklären wir die grundlegende Nutzung und Initialisierung von LocalDate im Detail.

Grundlegende Operationen mit LocalDate

LocalDate bietet eine intuitive und einfache API zur Datummanipulation. Dieser Abschnitt erläutert häufig genutzte Funktionen anhand konkreter Beispiele.

Das aktuelle Datum erhalten

Um das heutige Datum zu erhalten, verwenden Sie die Methode LocalDate.now(). Sie gibt das aktuelle Systemdatum (unabhängig von Zeitzonen) als LocalDate‑Instanz zurück.

import java.time.LocalDate;

LocalDate today = LocalDate.now();
System.out.println(today); // Example: 2025-06-26

Ein bestimmtes Datum erstellen

Um ein beliebiges Datum in der Vergangenheit oder Zukunft zu erzeugen, nutzen Sie LocalDate.of(int year, int month, int dayOfMonth). Damit können Sie frei Daten wie den 31. Dezember 2024 erstellen.

LocalDate specialDay = LocalDate.of(2024, 12, 31);
System.out.println(specialDay); // 2024-12-31

Ein Datum aus einem String parsen

Um ein LocalDate aus einem String wie „2023-03-15“ zu erzeugen, verwenden Sie die Methode LocalDate.parse(String text). Befolgt der String das standardmäßige ISO‑Format („YYYY‑MM‑DD“), ist keine zusätzliche Konfiguration nötig.

LocalDate parsedDate = LocalDate.parse("2023-03-15");
System.out.println(parsedDate); // 2023-03-15

Parsen mit einem benutzerdefinierten Format (Ergänzung)

Falls Sie Daten in einem eigenen Format wie „2023/03/15“ verarbeiten müssen, können Sie DateTimeFormatter mit parse() kombinieren.

import java.time.format.DateTimeFormatter;

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate formattedDate = LocalDate.parse("2023/03/15", formatter);
System.out.println(formattedDate); // 2023-03-15

Wie oben gezeigt, sind die Grundoperationen von LocalDate intuitiv und unkompliziert. In modernem Java‑Code ist das Initialisieren und Konvertieren von Daten selten verwirrend. Im nächsten Kapitel erklären wir, wie Sie Jahr, Monat, Tag und Wochentag aus einem LocalDate extrahieren.

Jahr, Monat, Tag und Wochentag ermitteln

LocalDate ermöglicht es Ihnen, nicht nur das Datum selbst, sondern auch einzelne Komponenten wie Jahr, Monat, Tag und Wochentag leicht zu extrahieren. Dieser Abschnitt beschreibt, wie Sie diese häufig genutzten Elemente abrufen können.

Jahr, Monat und Tag erhalten

Um jede Komponente aus einer LocalDate‑Instanz zu erhalten, verwenden Sie die dafür vorgesehenen Getter‑Methoden.

LocalDate date = LocalDate.of(2025, 6, 26);

int year = date.getYear();           // Year (e.g. 2025)
int month = date.getMonthValue();    // Month as a number (1–12, e.g. 6)
int day = date.getDayOfMonth();      // Day of month (1–31, e.g. 26)

System.out.println("Year: " + year);
System.out.println("Month: " + month);
System.out.println("Day: " + day);

Abrufen von Monats- und Wochentagsnamen

LocalDate unterstützt auch das Abrufen von Monats- und Wochentagsnamen, was nützlich ist, wenn Sie textuelle Darstellungen benötigen.

  • Monatsname (englische Darstellung) Die Verwendung von getMonth() liefert einen Month-Enum-Wert (z. B. JUNE).
    import java.time.Month;
    
    Month monthName = date.getMonth(); // JUNE (uppercase English)
    System.out.println(monthName);
    
  • Wochentagsname getDayOfWeek() liefert einen DayOfWeek-Enum (z. B. THURSDAY).
    import java.time.DayOfWeek;
    
    DayOfWeek dayOfWeek = date.getDayOfWeek(); // THURSDAY (uppercase English)
    System.out.println(dayOfWeek);
    

Anzeige von Monats- und Wochentagsnamen auf Japanisch

Wenn Sie Monats- oder Wochentagsnamen auf Japanisch statt auf Englisch anzeigen möchten, können Sie die Ausgabe mit DateTimeFormatter anpassen.

import java.time.format.DateTimeFormatter;
import java.util.Locale;

DateTimeFormatter formatter =
    DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)", Locale.JAPANESE);
String formatted = date.format(formatter); // 2025年06月26日(木)
System.out.println(formatted);

Zusammenfassung der abgerufenen Komponenten

Eine der wichtigsten Stärken von LocalDate ist, dass es Ihnen ermöglicht, Jahr, Monat, Tag und Wochentag mit intuitiven Methoden abzurufen. Diese Flexibilität erleichtert die Datumsverarbeitung in Geschäfts- und Webanwendungen erheblich.

Datumsberechnungen (Addition und Subtraktion)

Datumsberechnungen wie das Hinzufügen oder Subtrahieren von Tagen werden häufig für die Terminverwaltung und Fristberechnungen benötigt. Mit LocalDate können Sie sicher und intuitiv Vorgänge wie „drei Tage später“, „eine Woche früher“ oder „die Differenz zwischen zwei Daten“ ausführen.

Daten hinzufügen

  • Tage hinzufügen
    LocalDate today = LocalDate.of(2025, 6, 26);
    LocalDate threeDaysLater = today.plusDays(3); // Three days later
    System.out.println(threeDaysLater); // 2025-06-29
    
  • Monate oder Jahre hinzufügen
    LocalDate nextMonth = today.plusMonths(1); // One month later
    LocalDate nextYear = today.plusYears(1);   // One year later
    System.out.println(nextMonth); // 2025-07-26
    System.out.println(nextYear);  // 2026-06-26
    

Daten subtrahieren

  • Tage, Monate oder Jahre subtrahieren
    LocalDate lastWeek = today.minusWeeks(1);   // One week earlier
    LocalDate previousDay = today.minusDays(1); // Previous day
    System.out.println(lastWeek);    // 2025-06-19
    System.out.println(previousDay); // 2025-06-25
    

Berechnung von Differenzen zwischen Daten

  • Berechnung der Differenz in Tagen
    import java.time.temporal.ChronoUnit;
    
    LocalDate start = LocalDate.of(2025, 6, 1);
    LocalDate end = LocalDate.of(2025, 6, 26);
    
    long daysBetween = ChronoUnit.DAYS.between(start, end); // 25
    System.out.println(daysBetween); // 25
    
  • Berechnung von Differenzen mit anderen Einheiten (Monate, Jahre)
    long monthsBetween = ChronoUnit.MONTHS.between(start, end); // 0
    long yearsBetween = ChronoUnit.YEARS.between(start, end);   // 0
    

Zusammenfassung

Durch die Verwendung der Additions- und Subtraktionsmethoden von LocalDate können Sie gängige Datumsberechnungen wie „Frist des nächsten Monats“ oder „Tage seit dem letzten Ereignis“ einfach umsetzen.

Da LocalDate unveränderlich ist, wird die ursprüngliche Instanz niemals geändert. Jede Operation gibt eine neue LocalDate-Instanz zurück, was eine sichere Datumsverarbeitung gewährleistet.

Erweiterte Operationen: Anpassen spezifischer Daten

In der Praxis reicht eine einfache Addition oder Subtraktion von Daten oft nicht aus. Häufige Anforderungen umfassen die Bestimmung des „letzten Tages des Monats“ oder des „ersten Tages des nächsten Monats“. LocalDate bietet praktische APIs für solche Anpassungen.

.

Verwendung von TemporalAdjuster

Mit LocalDate können Sie die Methode with() und TemporalAdjuster kombinieren, um intuitive Vorgänge wie „Ende des Monats“, „Anfang des Monats“ oder „nächster bestimmter Wochentag“ auszuführen. Eingebaute Adjuster werden in der Klasse TemporalAdjusters bereitgestellt.

Ermitteln des ersten und letzten Tages eines Monats

  • Ermitteln des letzten Tages des Monats
    import java.time.LocalDate;
    import java.time.temporal.TemporalAdjusters;
    
    LocalDate date = LocalDate.of(2025, 6, 26);
    LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println(endOfMonth); // 2025-06-30
    
  • Ermitteln des ersten Tages des Monats
    LocalDate startOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());
    System.out.println(startOfMonth); // 2025-06-01
    

Anpassungen basierend auf Wochentagen

Anpassungen basierend auf Wochentagen – etwa „der zweite Montag des Monats“ oder „der nächste Freitag“ – lassen sich ebenfalls leicht umsetzen.

  • Ermitteln des nächsten Freitags
    import java.time.DayOfWeek;
    
    LocalDate nextFriday =
        date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
    System.out.println(nextFriday); // 2025-06-27
    
  • Ermitteln des zweiten Montags des aktuellen Monats
    LocalDate secondMonday =
        date.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY));
    System.out.println(secondMonday); // 2025-06-09
    

Anpassung an den Beginn oder das Ende eines Jahres

Sie können denselben Ansatz verwenden, um den ersten oder letzten Tag eines Jahres zu erhalten.

LocalDate startOfYear =
    date.with(TemporalAdjusters.firstDayOfYear());
LocalDate endOfYear =
    date.with(TemporalAdjusters.lastDayOfYear());

System.out.println(startOfYear); // 2025-01-01
System.out.println(endOfYear);   // 2025-12-31

Erstellen benutzerdefinierter Adjuster

Falls Sie eine eigene Datums‑Anpassungslogik basierend auf speziellen Geschäftsregeln benötigen, können Sie das Interface TemporalAdjuster selbst implementieren.

Durch die Kombination von LocalDate mit TemporalAdjusters werden selbst komplexe Datumsberechnungen intuitiv und flexibel. Das ist besonders nützlich beim Umgang mit Fristen oder geschäftsspezifischen Zeitplänen.

Arbeiten mit LocalDate und LocalDateTime

Im Java‑Datum‑und‑Zeit‑API (java.time‑Paket) repräsentiert LocalDate nur ein Datum, während LocalDateTime sowohl Datum als auch Uhrzeit enthält. In der Praxis müssen Entwickler häufig zwischen diesen beiden Typen konvertieren. Dieser Abschnitt erklärt, wie diese Konvertierungen durchgeführt werden.

Konvertierung von LocalDate zu LocalDateTime

Um einer LocalDate Zeitinformationen hinzuzufügen und sie in LocalDateTime zu konvertieren, verwenden Sie atTime() oder atStartOfDay().

  • Hinzufügen einer bestimmten Uhrzeit
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    
    LocalDate date = LocalDate.of(2025, 6, 26);
    LocalDateTime dateTime =
        date.atTime(14, 30, 0); // 2025-06-26 14:30:00
    System.out.println(dateTime);
    
  • Erstellen eines LocalDateTime zu Tagesbeginn
    LocalDateTime startOfDay =
        date.atStartOfDay(); // 2025-06-26T00:00
    System.out.println(startOfDay);
    

Konvertierung von LocalDateTime zu LocalDate

Um nur den Datumsanteil aus einem LocalDateTime zu extrahieren, verwenden Sie die Methode toLocalDate().

import java.time.LocalDateTime;

LocalDateTime dateTime =
    LocalDateTime.of(2025, 6, 26, 14, 30);
LocalDate dateOnly = dateTime.toLocalDate();
System.out.println(dateOnly); // 2025-06-26

Kombination von LocalDate mit LocalTime

Sie können auch ein LocalDate und ein LocalTime kombinieren, um ein LocalDateTime zu erzeugen.

import java.time.LocalTime;

LocalTime time = LocalTime.of(9, 0);
LocalDateTime combined =
    date.atTime(time); // 2025-06-26T09:00
System.out.println(combined);

Zusammenfassung

  • Konvertieren Sie LocalDate zu LocalDateTime mit atTime() oder atStartOfDay()
  • Konvertieren Sie LocalDateTime zu LocalDate mit toLocalDate()
  • Das Trennen und Zusammenführen von Datum und Uhrzeit ist in realen Systemen üblich

Ausnahmebehandlung und bewährte Praktiken

Die Behandlung von Daten kann leicht zu unerwarteten Ausnahmen führen, wenn ungültige Werte oder Formate verwendet werden. Sogar beim Arbeiten mit LocalDate können Ausnahmen aufgrund von nicht existierenden Daten oder Parsierfehlern auftreten. Dieser Abschnitt erklärt gängige Ausnahmen und Best Practices für eine sichere Behandlung.

Angabe eines Nicht-Existierenden Datums

Wenn Sie versuchen, ein Datum zu erstellen, das nicht existiert – wie zum Beispiel den 30. Februar 2023 – wird eine DateTimeException ausgelöst.

import java.time.LocalDate;

// Example that throws an exception
LocalDate invalidDate = LocalDate.of(2023, 2, 30);

In solchen Fällen ist es wichtig, die Ausnahme abzufangen und angemessen zu behandeln.

try {
    LocalDate invalidDate = LocalDate.of(2023, 2, 30);
} catch (DateTimeException e) {
    System.out.println("An invalid date was specified: " + e.getMessage());
}

Ausnahmen beim String-Parsing

Beim Verwenden von LocalDate.parse() wird eine DateTimeParseException ausgelöst, wenn das String-Format ungültig ist oder das Datum selbst nicht existiert.

import java.time.format.DateTimeParseException;

try {
    LocalDate date = LocalDate.parse("2023/02/30");
} catch (DateTimeParseException e) {
    System.out.println("Failed to parse date: " + e.getMessage());
}

Best Practices

  • Eingabewerte im Voraus validieren Beim Akzeptieren von Benutzereingaben validieren Sie sowohl das Format als auch den Wert vor dem Parsen, um Ausnahmen zu verhindern.
  • Ausnahmen abfangen und benutzerfreundliche Nachrichten bereitstellen Statt die Anwendung abstürzen zu lassen, geben Sie klare und verständliche Fehlermeldungen an den Benutzer zurück.
  • Unveränderlichkeit nutzen Da LocalDate unveränderlich ist, behandeln Sie Rechenergebnisse immer als neue Instanzen anstatt bestehende zu überschreiben.

Häufige Fallstricke

  • Behandlung des 29. Februar in Schaltjahren
  • Angabe von Werten außerhalb gültiger Bereiche (z. B. Monat = 13, Tag = 0)
  • Nicht übereinstimmende Formate beim String-Parsing

Diese Probleme sind besonders bei Anfängern häufig, daher ist besondere Sorgfalt erforderlich.

Praktische Anwendungsfälle für LocalDate

LocalDate ist nicht auf einfache Datenspeicherung beschränkt – es wird weit verbreitet in realen Geschäfts- und Anwendungssystemen verwendet. Nachfolgend sind mehrere praktische Beispiele aufgeführt.

Geburtstag und Altersberechnung

Die Berechnung des Alters einer Person basierend auf ihrem Geburtsdatum ist ein klassisches Anwendungsszenario. Die Verwendung von LocalDate zusammen mit Period macht dies einfach.

import java.time.LocalDate;
import java.time.Period;

LocalDate birthDay = LocalDate.of(1990, 8, 15);
LocalDate today = LocalDate.now();

Period period = Period.between(birthDay, today);
int age = period.getYears();
System.out.println("Age: " + age);

Verwalten von Fristen und Fälligkeitsdaten

LocalDate ist auch nützlich für Task-Management-Systeme, wie z. B. die Berechnung, wie viele Tage bis zu einer Frist verbleiben.

LocalDate deadline = LocalDate.of(2025, 7, 10);
long daysLeft =
    java.time.temporal.ChronoUnit.DAYS.between(today, deadline);

System.out.println("Days remaining until deadline: " + daysLeft);

Planung und Kalendererzeugung

Anforderungen wie „ein Meeting am zweiten Montag jedes Monats“ können einfach mit TemporalAdjusters implementiert werden.

import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;

LocalDate secondMonday =
    LocalDate.of(2025, 7, 1)
        .with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY));

System.out.println("Second Monday of July: " + secondMonday);

Datumsvalidierung in Web-Systemen und APIs

LocalDate wird häufig in Backend-Systemen zur Validierung von Datums-Eingaben verwendet. Zum Beispiel möchten Sie zukünftige Daten oder Daten, die älter als ein bestimmter Bereich sind, ablehnen.

LocalDate inputDate = LocalDate.parse("2024-12-31");
LocalDate tenYearsAgo = today.minusYears(10);

if (inputDate.isAfter(today)) {
    System.out.println("Zukünftige Daten sind nicht erlaubt");
} else if (inputDate.isBefore(tenYearsAgo)) {
    System.out.println("Bitte geben Sie ein Datum aus den letzten 10 Jahren an");
} else {
    System.out.println("Das Datum ist gültig");
}

Adoption in Training and Production Systems

As seen in many competing articles, LocalDate is now a standard topic in Java training programs and onboarding curricula. It is also widely used in production systems such as banking business-day calculations and inventory management.

FAQ (Frequently Asked Questions)

Q1. What is the difference between LocalDate and Date?

A.
LocalDate is part of the modern Java Date and Time API introduced in Java 8 and represents only a date (year, month, day). java.util.Date, on the other hand, is a legacy class that includes time and internally manages values in milliseconds.

LocalDate is immutable, intuitive, and thread-safe, and is recommended for modern Java development.

Q2. Can LocalDate handle time zones?

A.
LocalDate itself does not contain time zone information. If time zone support is required, use ZonedDateTime or OffsetDateTime. A common approach is to manage dates with LocalDate first, then convert when time zones become necessary.

Q3. What is the difference between LocalDate and LocalDateTime?

A.
LocalDate represents only a date. LocalDateTime represents both date and time (e.g. 2025-06-26 14:00). Use LocalDate for deadlines or anniversaries, and LocalDateTime for events with precise timestamps.

Q4. Can I parse custom date formats?

A.
Yes. By using DateTimeFormatter, you can parse dates in custom formats.

import java.time.format.DateTimeFormatter;

DateTimeFormatter formatter =
    DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date =
    LocalDate.parse("2025/06/26", formatter);

Q5. How should I handle invalid dates or formats?

A.
Invalid dates or formats cause exceptions such as DateTimeException or DateTimeParseException. Use try-catch blocks, validate input in advance, and provide clear error messages to users.

Q6. Can I compare two LocalDate instances?

A.
Yes. Use isAfter(), isBefore(), or isEqual().

LocalDate date1 = LocalDate.of(2025, 6, 26);
LocalDate date2 = LocalDate.of(2025, 7, 1);

if (date1.isBefore(date2)) {
    System.out.println("date1 ist früher als date2");
}

Conclusion

This article provided a comprehensive explanation of Java LocalDate, from basic concepts to advanced use cases. Key points include:

  • What LocalDate is An immutable date-only object introduced in Java 8 that fixes the flaws of legacy Date and Calendar classes.
  • Basic usage Retrieving the current date, creating specific dates, and parsing strings using simple APIs.
  • Extracting components Easily retrieving year, month, day, and weekday values.
  • Date calculations Intuitive addition, subtraction, and difference calculations.
  • Date adjustments Using TemporalAdjusters to handle end-of-month, weekdays, and more.
  • Integration with time APIs Flexible conversion between LocalDate, LocalDateTime, and LocalTime.
  • Safe handling and best practices Proper exception handling and validation for robust systems.
  • Real-world applications and FAQs Practical examples such as age calculation, deadlines, scheduling, and validation.

Next Steps

Once you master LocalDate, date handling becomes straightforward and reliable. For more advanced scenarios—such as time zones, period calculations, and formatting—consider learning ZonedDateTime, Period, and DateTimeFormatter.

Use LocalDate as a powerful foundation to build clean, robust, and maintainable Java applications.