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
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 nextWeek = today.plusWeeks(1);
LocalDate nextMonth = today.plusMonths(1);
LocalDate nextYear = today.plusYears(1);
LocalDate yesterday = today.minusDays(1);
3. Datumsvergleich
Beispiel
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 firstDayOfMonth = date.withDayOfMonth(1);
LocalDate lastDayOfYear = date.with(TemporalAdjusters.lastDayOfYear());
Formatierung und Parsing
1. Formatierung von Datumsangaben
Beispiel
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = date.format(formatter);
2. Parsen eines Strings in ein Datum
Beispiel
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 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 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
int daysInMonth = date.lengthOfMonth();
for (int i = 1; i <= daysInMonth; i++) {
System.out.println(date.withDayOfMonth(i));
}
Umfassendes Beispiel
Beispiel
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 java.nio.file.Files