Java LocalDate-Klasse

LocalDate ist eine unveränderliche Datumsklasse, die in Java 8 eingeführt wurde und zumjava.timedas Paket verwenden.

LocalDate repräsentiert ein Datum ohne Zeitzone (Jahr-Monat-Tag), wie z. B. "2023-05-15". LocalDate enthält keine Uhrzeit- und Zeitzoneninformationen, was es sehr geeignet für Szenarien macht, die nur Datumsangaben erfordern, wie Geburtstage und Feiertage.


Hauptmerkmale von LocalDate

1. Unveränderlichkeit

LocalDate-Instanzen sind unveränderlich; jede Änderungsoperation gibt ein neues LocalDate-Objekt zurück, anstatt das ursprüngliche Objekt zu ändern.

2. Threadsicherheit

Aufgrund der Unveränderlichkeit ist LocalDate threadsicher und kann sicher in Multithread-Umgebungen verwendet werden.

3. ISO-8601-Standard

LocalDate folgt dem ISO-8601-Kalendersystem, das der internationale Standard für die moderne Datums- und Zeitdarstellung ist.


Erstellen von LocalDate-Objekten

1. Abrufen des aktuellen Datums

LocalDate today = LocalDate.now();
System.out.println("今天的日期: " + today);

2. Erstellen mit einem bestimmten Datum

LocalDate specificDate = LocalDate.of(2023, Month.MAY, 15);
// 或者
LocalDate specificDate2 = LocalDate.of(2023, 5, 15);

3. Parsen aus einem String

LocalDate parsedDate = LocalDate.parse("2023-05-15");

Häufige Operationsmethoden

1. Abrufen von Datumsinformationen

Beispiel

LocalDate date = LocalDate.of(2023, 5, 15);
int year = date.getYear();        // 2023
Month month = date.getMonth();    // MAY
int day = date.getDayOfMonth();   // 15
DayOfWeek dow = date.getDayOfWeek(); // MONDAY
int len = date.lengthOfMonth();   // 31 (Tage im Mai)
boolean leap = date.isLeapYear(); // false (2023 ist kein Schaltjahr)

2. Datumsaddition und -subtraktion

Beispiel

LocalDate tomorrow = today.plusDays(1);
LocalDate nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);

3. Datumsvergleich

Beispiel

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 6, 20);

boolean isBefore = date1.isBefore(date2); // true
boolean isAfter = date1.isAfter(date2);   // false
boolean isEqual = date1.isEqual(date2);   // false

4. Datumsanpassung

Beispiel

LocalDate date = LocalDate.of(2023, 5, 15);
LocalDate firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());

Formatierung und Parsing

1. Formatierung von Datumsangaben

Beispiel

LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);

2. Parsen eines Strings in ein Datum

Beispiel

String dateStr = "2023/05/15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date = LocalDate.parse(dateStr, formatter);

Praktische Anwendungsbeispiele

1. Berechnung der Anzahl der Tage zwischen zwei Datumsangaben

Beispiel

LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 15);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("Tagesdifferenz: " + daysBetween);

2. Prüfen, ob ein Datum innerhalb eines Bereichs liegt

Beispiel

LocalDate dateToCheck = LocalDate.of(2023, 5, 10);
LocalDate startDate = LocalDate.of(2023, 5, 1);
LocalDate endDate = LocalDate.of(2023, 5, 31);
if (dateToCheck.isAfter(startDate) && dateToCheck.isBefore(endDate)) {
    System.out.println("Datum liegt innerhalb des Bereichs");
}

3. Alle Daten eines Monats abrufen

Beispiel

LocalDate date = LocalDate.of(2023, 5, 1);
int daysInMonth = date.lengthOfMonth();

for (int i = 1; i <= daysInMonth; i++) {
    System.out.println(date.withDayOfMonth(i));
}

Umfassendes Beispiel

Beispiel

import java.time.LocalDate;
import java.time.Month;
import java.time.DayOfWeek;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class LocalDateDemo {

    public static void main(String[] args) {
        // 1. Erstellen von LocalDate-Instanzen
        System.out.println("=== Erstellen von LocalDate-Instanzen ===");
        LocalDate today = LocalDate.now();
        LocalDate specificDate = LocalDate.of(2023, Month.JULY, 15);
        LocalDate parsedDate = LocalDate.parse("2023-08-20");
       
        System.out.println("Aktuelles Datum: " + today);
        System.out.println("Bestimmtes Datum: " + specificDate);
        System.out.println("Geparstes Datum: " + parsedDate);

        // 2. Abrufen von Datumsinformationen
        System.out.println("\n=== Abrufen von Datumsinformationen ===);
        System.out.println("Jahr: " + today.getYear());
        System.out.println("Monat: " + today.getMonth() + " (" + today.getMonthValue() + ")");
        System.out.println("Tag: " + today.getDayOfMonth());
        System.out.println("Wochentag: " + today.getDayOfWeek());
        System.out.println("Tag des Jahres: " + today.getDayOfYear());
        System.out.println("Tage im Monat: " + today.lengthOfMonth());
        System.out.println("Tage im Jahr: " + today.lengthOfYear());
        System.out.println("Ist Schaltjahr: " + today.isLeapYear());

        // 3. Datumsberechnung
        System.out.println("\n=== Datumsberechnung ===);
        System.out.println("Plus 5 Tage: " + today.plusDays(5));
        System.out.println("Plus 2 Wochen: " + today.plusWeeks(2));
        System.out.println("Plus 3 Monate: " + today.plusMonths(3));
        System.out.println("Minus 1 Jahr: " + today.minusYears(1));
       
        System.out.println("Erster Tag des nächsten Monats: " + today.plusMonths(1).withDayOfMonth(1));
        System.out.println("Letzter Tag dieses Monats: " + today.withDayOfMonth(today.lengthOfMonth()));

        // 4. Datumsvergleich
        System.out.println("\n=== Datumsvergleich ===);
        LocalDate date1 = LocalDate.of(2023, 6, 15);
        LocalDate date2 = LocalDate.of(2023, 6, 20);
       
        System.out.println(date1 + " ist " + date2 + " davor? " + date1.isBefore(date2));
        System.out.println(date1 + " ist " + date2 + " danach? " + date1.isAfter(date2));
        System.out.println(date1 + " gleich " + date2 + "? " + date1.isEqual(date2));
       
        // 5. Berechnung der Datumsdifferenz
        System.out.println("\n=== Berechnung der Datumsdifferenz ===);
        LocalDate startDate = LocalDate.of(2023, 1, 1);
        LocalDate endDate = LocalDate.of(2023, 12, 31);
       
        System.out.println("Tage zwischen zwei Datumswerten: " + ChronoUnit.DAYS.between(startDate, endDate));
        System.out.println("Monate zwischen zwei Datumswerten: " + ChronoUnit.MONTHS.between(startDate, endDate));
        System.out.println("Jahre zwischen zwei Datumswerten: " + ChronoUnit.YEARS.between(startDate, endDate));

        // 6. Datumsformatierung
        System.out.println("\n=== Datumsformatierung ===);
        DateTimeFormatter basicFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        DateTimeFormatter chineseFormatter = DateTimeFormatter.ofPattern(yyyy-MM-dd EEEE, Locale.CHINA);
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
       
        System.out.println("Basisformat: " + today.format(basicFormatter));
        System.out.println("Chinesisches Format: " + today.format(chineseFormatter));
        System.out.println("Englisches Format: " + today.format(customFormatter));

        // 7. Weitere nützliche Methoden
        System.out.println("\n=== Weitere nützliche Methoden ===);
        System.out.println("Auf den nächsten Montag angepasst: " + today.with(DayOfWeek.MONDAY));
        System.out.println("Ist Wochenende: " +
            (today.getDayOfWeek() == DayOfWeek.SATURDAY || today.getDayOfWeek() == DayOfWeek.SUNDAY));
       
        // 8. Datumsbereichsiteration
        System.out.println("\n=== Datumsbereichsiteration ===);
        System.out.println("Daten für die nächsten 7 Tage:");
        today.datesUntil(today.plusDays(7))
             .forEach(System.out::println);
    }
}

Die Ausgabe wird in etwa wie folgt aussehen:

=== 创建 LocalDate 实例 ===
当前日期: 2023-06-15
特定日期: 2023-07-15
解析日期: 2023-08-20

=== 获取日期信息 ===
年: 2023
月: JUNE (6)
日: 15
星期: THURSDAY
一年中的第几天: 166
月份天数: 30
年份天数: 365
是否闰年: false

=== 日期计算 ===
加5天: 2023-06-20
加2周: 2023-06-29
加3个月: 2023-09-15
减1年: 2022-06-15
下个月的第一天: 2023-07-01
本月的最后一天: 2023-06-30

=== 日期比较 ===
2023-06-15 在 2023-06-20 之前? true
2023-06-15 在 2023-06-20 之后? false
2023-06-15 等于 2023-06-20? false

=== 计算日期差 ===
两个日期之间的天数: 364
两个日期之间的月数: 11
两个日期之间的年数: 0

=== 日期格式化 ===
基本格式: 2023/06/15
中文格式: 2023年06月15日 星期四
英文格式: Jun 15, 2023

=== 其他实用方法 ===
调整到下个星期一: 2023-06-19
是否是周末: false

=== 日期范围迭代 ===
接下来7天的日期:
2023-06-15
2023-06-16
2023-06-17
2023-06-18
2023-06-19
2023-06-20
2023-06-21

Zusammenfassung

Die Klasse LocalDate ist ein wichtiger Bestandteil der Java 8 Date-Time API. Sie bietet umfangreiche Methoden für die Handhabung datumsbezogener Operationen. Im Vergleich zu den alten Klassen Date und Calendar ist LocalDate intuitiver, einfacher zu verwenden und threadsicher. Die Beherrschung von LocalDate kann die Effizienz der Datumsverarbeitung und die Lesbarkeit des Codes erheblich verbessern.

Im Folgenden sind die gängigen Methoden aufgeführt:

Statische Factory-Methoden

Methode Beschreibung Beispiel
static LocalDate now() Aktuelles Datum abrufen LocalDate.now()
static LocalDate of(int year, int month, int dayOfMonth) Mit einem angegebenen Jahr, Monat und Tag erstellen LocalDate.of(2023, 6, 15)
static LocalDate of(int year, Month month, int dayOfMonth) Mit einem angegebenen Jahr, Monat und Tag erstellen (unter Verwendung des Month-Enums) LocalDate.of(2023, Month.JUNE, 15)
static LocalDate parse(CharSequence text) Aus einer Zeichenkette parsen (ISO-Format: yyyy-MM-dd) LocalDate.parse("2023-06-15")
static LocalDate parse(CharSequence text, DateTimeFormatter formatter) Mit einem angegebenen Format parsen LocalDate.parse("15/06/2023", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

Datumsinformationen abrufen

Methode Beschreibung Beispiel
int getYear() Jahr abrufen 2023
Month getMonth() Monat abrufen (Month enum) Month.JUNE
int getMonthValue() Monatswert abrufen (1-12) 6
int getDayOfMonth() Tag des Monats abrufen 15
int getDayOfYear() Tag des Jahres abrufen 166
DayOfWeek getDayOfWeek() Wochentag abrufen (DayOfWeek enum) DayOfWeek.THURSDAY
int lengthOfMonth() Anzahl der Tage im Monat zurückgeben 30
int lengthOfYear() Anzahl der Tage im Jahr zurückgeben (365 oder 366) 365
boolean isLeapYear() Prüfen, ob es ein Schaltjahr ist false

Datumsoperationen

Methode Beschreibung Beispiel
LocalDate plusDays(long days) Tage hinzufügen date.plusDays(5)
LocalDate plusWeeks(long weeks) Wochen hinzufügen date.plusWeeks(2)
LocalDate plusMonths(long months) Monate hinzufügen date.plusMonths(3)
LocalDate plusYears(long years) Jahre hinzufügen date.plusYears(1)
LocalDate minusDays(long days) Tage subtrahieren date.minusDays(5)
LocalDate minusWeeks(long weeks) Wochen subtrahieren date.minusWeeks(2)
LocalDate minusMonths(long months) Monate subtrahieren date.minusMonths(3)
LocalDate minusYears(long years) Jahre subtrahieren date.minusYears(1)
LocalDate withDayOfMonth(int dayOfMonth) Den Tag des Monats ändern date.withDayOfMonth(1)
LocalDate withDayOfYear(int dayOfYear) Den Tag des Jahres ändern date.withDayOfYear(100)
LocalDate withMonth(int month) Den Monat ändern date.withMonth(12)
LocalDate withYear(int year) Das Jahr ändern date.withYear(2024)

Date-Vergleich

Methode Beschreibung Beispiel
boolean isAfter(ChronoLocalDate other) Prüfen, ob es nach dem angegebenen Datum liegt date1.isAfter(date2)
boolean isBefore(ChronoLocalDate other) Prüfen, ob es vor dem angegebenen Datum liegt date1.isBefore(date2)
boolean isEqual(ChronoLocalDate other) Prüfen, ob es gleich dem angegebenen Datum ist date1.isEqual(date2)
long until(ChronoLocalDate endDate, ChronoUnit unit) Die Zeitspanne zwischen zwei Datumsangaben berechnen date1.until(date2, ChronoUnit.DAYS)

Formatierung und Konvertierung

Methode Beschreibung Beispiel
String format(DateTimeFormatter formatter) Als Zeichenkette formatieren date.format(DateTimeFormatter.ISO_DATE)
String toString() In eine Zeichenkette im ISO-Format konvertieren (yyyy-MM-dd) "2023-06-15"
long toEpochDay() In die Anzahl der Tage seit 1970-01-01 konvertieren 19531
LocalDateTime atTime(int hour, int minute) In LocalDateTime konvertieren date.atTime(14, 30)
LocalDateTime atTime(LocalTime time) In LocalDateTime konvertieren date.atTime(LocalTime.now())

Weitere nützliche Methoden

Methode Beschreibung Beispiel
boolean isSupported(ChronoUnit unit) Prüfen, ob die Zeiteinheit unterstützt wird date.isSupported(ChronoUnit.DAYS)
boolean isSupported(ChronoField field) Prüfen, ob das Zeitfeld unterstützt wird date.isSupported(ChronoField.HOUR_OF_DAY)
LocalDate with(TemporalAdjuster adjuster) Datum mithilfe eines Adjusters anpassen date.with(TemporalAdjusters.firstDayOfMonth())

Java File Java java.nio.file.Files

Weitere Erweiterungen