Java LocalDateTime-Klasse
LocalDateTime ist eine wichtige Klasse in der mit Java 8 eingeführten Datum-Zeit-API (dem java.time-Paket). Sie repräsentiert ein unveränderliches Datum-Zeit-Objekt ohne Zeitzoneninformationen. Diese Klasse kann Datum-Zeit-Informationen mit Genauigkeit für Jahr, Monat, Tag, Stunde, Minute, Sekunde und Nanosekunde speichern.
Eigenschaften von LocalDateTime
- Unveränderlichkeit: Alle java.time-Klassen sind unveränderlich und threadsicher
- Keine Zeitzoneninformationen: Stellt nur das lokale Datum und die lokale Uhrzeit dar
- Nanosekundengenauigkeit: Kann Zeit mit Nanosekundengenauigkeit darstellen
- Umfangreiche API: Bietet zahlreiche Methoden zur Datums- und Uhrzeitberechnung und -formatierung
Erstellen von LocalDateTime-Objekten
1. Verwenden von statischen Factory-Methoden
Beispiel
LocalDateTime now = LocalDateTime.now();
// Mit einem angegebenen Datum und einer angegebenen Uhrzeit erstellen
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30, 45);
// Verwendung von Jahr, Monat, Tag, Stunde, Minute
LocalDateTime dateTime1 = LocalDateTime.of(2023, Month.MAY, 15, 14, 30);
// Verwendung von Jahr, Monat, Tag, Stunde, Minute, Sekunde
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 15, 14, 30, 45);
// Verwendung von Jahr, Monat, Tag, Stunde, Minute, Sekunde, Nanosekunde
LocalDateTime dateTime3 = LocalDateTime.of(2023, 5, 15, 14, 30, 45, 100);
2. Kombinieren aus LocalDate und LocalTime
Beispiel
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);
3. Zeichenketten parsen
Beispiel
Gängige Operationsmethoden
Abrufen von Datums- und Zeitkomponenten
Beispiel
int year = dateTime.getYear();
Month month = dateTime.getMonth(); // Gibt das Month-Enum zurück
int monthValue = dateTime.getMonthValue(); // Gibt 1-12 zurück
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.getSecond();
int nano = dateTime.getNano();
Datums-/Uhrzeit-Arithmetik
Beispiel
// Additionsoperationen
LocalDateTime plusYears = dateTime.plusYears(1);
LocalDateTime plusMonths = dateTime.plusMonths(1);
LocalDateTime plusDays = dateTime.plusDays(1);
LocalDateTime plusHours = dateTime.plusHours(1);
LocalDateTime plusMinutes = dateTime.plusMinutes(1);
LocalDateTime plusSeconds = dateTime.plusSeconds(1);
// Subtraktionsoperationen
LocalDateTime minusYears = dateTime.minusYears(1);
LocalDateTime minusDays = dateTime.minusDays(1);
// Andere Subtraktionsoperationen sind ähnlich...
Datums-/Zeitvergleich
Beispiel
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 16, 14, 30);
boolean isBefore = dateTime1.isBefore(dateTime2); // true
boolean isAfter = dateTime1.isAfter(dateTime2); // false
boolean isEqual = dateTime1.isEqual(dateTime2); // false
Datum und Uhrzeit anpassen
Beispiel
// Bestimmte Felder ändern
LocalDateTime withYear = dateTime.withYear(2024);
LocalDateTime withHour = dateTime.withHour(15);
// Andere Felder sind ähnlich...
// TemporalAdjusters verwenden
LocalDateTime firstDayOfMonth = dateTime.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDayOfYear = dateTime.with(TemporalAdjusters.lastDayOfYear());
Formatieren und Parsen
Formatieren von Datum und Uhrzeit
Beispiel
// Ein vordefiniertes Format verwenden
DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
String formatted = dateTime.format(isoDateTime);
// Benutzerdefiniertes Format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String customFormatted = dateTime.format(formatter);
Parsen einer Zeichenfolge in Datum/Uhrzeit
Beispiel
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(str, formatter);
Konvertierungen mit anderen Datum/Uhrzeit-Klassen
Konvertierung in LocalDate und LocalTime
Beispiel
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
Konvertierung mit Instant und ZonedDateTime
Beispiel
ZoneId zone = ZoneId.systemDefault();
// LocalDateTime in ZonedDateTime umwandeln
ZonedDateTime zonedDateTime = dateTime.atZone(zone);
// ZonedDateTime in LocalDateTime umwandeln
LocalDateTime fromZoned = zonedDateTime.toLocalDateTime();
// LocalDateTime in Instant umwandeln
Instant instant = zonedDateTime.toInstant();
// Instant in LocalDateTime umwandeln
LocalDateTime fromInstant = LocalDateTime.ofInstant(instant, zone);
Praktische Anwendungsbeispiele
Berechnung des Intervalls zwischen zwei Datum-Zeit-Werten
Beispiel
LocalDateTime end = LocalDateTime.of(2023, 5, 16, 17, 30);
Duration duration = Duration.between(start, end);
long hours = duration.toHours(); // 32
long minutes = duration.toMinutes(); // 1950
Prüfen, ob ein Datum innerhalb eines bestimmten Bereichs liegt
Beispiel
LocalDateTime startDate = LocalDateTime.of(2023, 5, 1, 0, 0);
LocalDateTime endDate = LocalDateTime.of(2023, 5, 31, 23, 59);
boolean isInRange = !checkDate.isBefore(startDate) && !checkDate.isAfter(endDate);
Erzeugen einer Datums-Zeit-Sequenz
Beispiel
List<LocalDateTime> dateTimes = new ArrayList<>();
for (int i = 0; i < 10; i++) {
dateTimes.add(start.plusDays(i));
}
Umfassendes Beispiel
Beispiel
import java.time.format.DateTimeFormatter;
public class LocalDateTimeDemo {
public static void main(String[] args) {
// 1. Aktuelles Datum und Uhrzeit abrufen
LocalDateTime now = LocalDateTime.now();
System.out.println("Aktuelles Datum und Uhrzeit: " + now);
// 2. Ein bestimmtes Datum und Uhrzeit erstellen
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 10, 30, 45);
System.out.println("Bestimmtes Datum und Uhrzeit: " + specificDateTime);
// 3. Aus einer Zeichenkette parsen
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T10:30:45");
System.out.println("Geparste Datum/Uhrzeit: " + parsedDateTime);
// 4. Ausgabe formatieren
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);
String formattedDateTime = now.format(formatter);
System.out.println("Formatierte Datum/Uhrzeit: " + formattedDateTime);
// 5. Jede Komponente abrufen
System.out.println("Jahr: " + now.getYear());
System.out.println("Monat: " + now.getMonthValue() + " (" + now.getMonth() + ")");
System.out.println("Tag: " + now.getDayOfMonth());
System.out.println("Stunde: " + now.getHour());
System.out.println("Minute: " + now.getMinute());
System.out.println("Sekunde: " + now.getSecond());
// 6. Datums-/Zeitoperationen
LocalDateTime tomorrow = now.plusDays(1);
System.out.println("Morgen um diese Zeit: " + tomorrow);
LocalDateTime lastWeek = now.minusWeeks(1);
System.out.println("Letzte Woche um diese Zeit: " + lastWeek);
// 7. Datum-Zeiten vergleichen
System.out.println("Ist jetzt nach dem spezifischen Zeitpunkt: " + now.isAfter(specificDateTime));
System.out.println("Ist jetzt vor dem spezifischen Zeitpunkt: " + now.isBefore(specificDateTime));
}
}
Die Ausgabe ist:
格式化后的日期时间: 2025年05月01日 11:25:48 年: 2025 月: 5 (MAY) 日: 1 时: 11 分: 25 秒: 48 明天此时: 2025-05-02T11:25:48.651400 上周此时: 2025-04-24T11:25:48.651400 现在是否在特定时间之后: true 现在是否在特定时间之前: false
Datums-/Zeitkonvertierung
Beispiel
public class DateTimeConversion {
public static void main(String[] args) {
// LocalDateTime in LocalDate und LocalTime umwandeln
LocalDateTime dateTime = LocalDateTime.now();
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
System.out.println("Datumsteil: " + date);
System.out.println("Zeitteil: " + time);
// LocalDateTime aus LocalDate und LocalTime erstellen
LocalDateTime combined = LocalDateTime.of(date, time);
System.out.println("Kombiniertes Datum und Uhrzeit: " + combined);
// Mit Instant umwandeln (erfordert Zeitzone)
ZoneId zone = ZoneId.of("Asia/Shanghai");
Instant instant = dateTime.atZone(zone).toInstant();
System.out.println("In Instant umgewandelt: " + instant);
}
}
Die Ausgabe ist:
日期部分: 2025-05-01 时间部分: 11:27:02.724101 组合后的日期时间: 2025-05-01T11:27:02.724101 转换为Instant: 2025-05-01T03:27:02.724101Z
Zusammenfassung
Die Klasse LocalDateTime ist eine sehr praktische Klasse in der Datums- und Uhrzeit-API von Java 8. Sie bietet umfangreiche Methoden für den Umgang mit Datum und Uhrzeit ohne Zeitzonen. Durch diesen Artikel sollten Sie Folgendes beherrschen:
- Wie man LocalDateTime-Objekte erstellt
- Wie man Berechnungen und Vergleiche mit Datum und Uhrzeit durchführt
- Wie man Datum und Uhrzeit formatiert und parst
- Wie man mit anderen Datum-Uhrzeit-Klassen konvertiert
- Einige praktische Anwendungsszenarien
LocalDateTime eignet sich sehr gut für Geschäftsszenarien, die keine Zeitzoneninformationen erfordern, wie Geburtstage und Besprechungszeiten. Für Szenarien, die eine Zeitzonenbehandlung erfordern, sollten Sie die Klasse ZonedDateTime in Betracht ziehen.
Statische Factory-Methoden
| Methode | Beschreibung | Beispiel |
|---|---|---|
static LocalDateTime now() |
Aktuelles Datum und aktuelle Uhrzeit abrufen | LocalDateTime.now() |
static LocalDateTime of(int year, int month, int day, int hour, int minute) |
Erstellen mit angegebenem Jahr, Monat, Tag, Stunde, Minute | LocalDateTime.of(2023, 6, 15, 14, 30) |
static LocalDateTime of(int year, int month, int day, int hour, int minute, int second) |
Erstellen mit angegebenem Jahr, Monat, Tag, Stunde, Minute, Sekunde | LocalDateTime.of(2023, 6, 15, 14, 30, 45) |
static LocalDateTime of(int year, Month month, int day, int hour, int minute) |
Erstellen mit dem Month-Enum | LocalDateTime.of(2023, Month.JUNE, 15, 14, 30) |
static LocalDateTime of(LocalDate date, LocalTime time) |
Erstellen durch Kombinieren von LocalDate und LocalTime | LocalDateTime.of(LocalDate.now(), LocalTime.now()) |
static LocalDateTime parse(CharSequence text) |
Aus Zeichenkette parsen (ISO-Format) | LocalDateTime.parse("2023-06-15T14:30:45") |
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) |
Mit einem angegebenen Format parsen | LocalDateTime.parse("15/06/2023 14:30", DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm")) |
Abrufen von Datums- und Uhrzeitinformationen
| 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 getHour() |
Stunde abrufen (0-23) | 14 |
int getMinute() |
Minute abrufen (0-59) | 30 |
int getSecond() |
Sekunde abrufen (0-59) | 45 |
int getNano() |
Nanosekunde abrufen | 0 |
Datums- und Zeitoperationen
| Methode | Beschreibung | Beispiel |
|---|---|---|
LocalDateTime plusDays(long days) |
Tage hinzufügen | dt.plusDays(5) |
LocalDateTime plusHours(long hours) |
Stunden hinzufügen | dt.plusHours(2) |
LocalDateTime plusMinutes(long minutes) |
Minuten hinzufügen | dt.plusMinutes(30) |
LocalDateTime plusSeconds(long seconds) |
Sekunden hinzufügen | dt.plusSeconds(45) |
LocalDateTime plusNanos(long nanos) |
Nanosekunden hinzufügen | dt.plusNanos(1000000) |
LocalDateTime minusDays(long days) |
Tage subtrahieren | dt.minusDays(5) |
LocalDateTime minusHours(long hours) |
Stunden subtrahieren | dt.minusHours(2) |
LocalDateTime minusMinutes(long minutes) |
Minuten subtrahieren | dt.minusMinutes(30) |
LocalDateTime minusSeconds(long seconds) |
Sekunden subtrahieren | dt.minusSeconds(45) |
LocalDateTime minusNanos(long nanos) |
Nanosekunden subtrahieren | dt.minusNanos(1000000) |
LocalDateTime withYear(int year) |
Jahr ändern | dt.withYear(2024) |
LocalDateTime withMonth(int month) |
Monat ändern | dt.withMonth(12) |
LocalDateTime withDayOfMonth(int day) |
Tag des Monats ändern | dt.withDayOfMonth(1) |
LocalDateTime withHour(int hour) |
Stunde ändern | dt.withHour(0) |
LocalDateTime withMinute(int minute) |
Minute ändern | dt.withMinute(0) |
LocalDateTime withSecond(int second) |
Sekunde ändern | dt.withSecond(0) |
LocalDateTime withNano(int nano) |
Nanosekunde ändern | dt.withNano(0) |
Datums-/Zeitvergleich
| Methode | Beschreibung | Beispiel |
|---|---|---|
boolean isAfter(ChronoLocalDateTime<?> other) |
Ob es nach dem angegebenen Datum/Uhrzeit liegt | dt1.isAfter(dt2) |
boolean isBefore(ChronoLocalDateTime<?> other) |
Ob es vor dem angegebenen Datum/Uhrzeit liegt | dt1.isBefore(dt2) |
boolean isEqual(ChronoLocalDateTime<?> other) |
Ob es gleich dem angegebenen Datum/Uhrzeit ist | dt1.isEqual(dt2) |
int compareTo(ChronoLocalDateTime<?> other) |
Zwei Datum/Uhrzeit-Werte vergleichen | dt1.compareTo(dt2) |
Konvertierungsmethoden
| Methode | Beschreibung | Beispiel |
|---|---|---|
LocalDate toLocalDate() |
In LocalDate konvertieren | dt.toLocalDate() |
LocalTime toLocalTime() |
In LocalTime konvertieren | dt.toLocalTime() |
Instant toInstant(ZoneOffset offset) |
In Instant konvertieren | dt.toInstant(ZoneOffset.UTC) |
ZonedDateTime atZone(ZoneId zone) |
In ZonedDateTime konvertieren | dt.atZone(ZoneId.of("Asia/Shanghai")) |
OffsetDateTime atOffset(ZoneOffset offset) |
In OffsetDateTime konvertieren | dt.atOffset(ZoneOffset.ofHours(8)) |
Formatierung und String-Konvertierung
| Methode | Beschreibung | Beispiel |
|---|---|---|
String format(DateTimeFormatter formatter) |
Als String formatieren | dt.format(DateTimeFormatter.ISO_DATE_TIME) |
String toString() |
In einen String im ISO-Format konvertieren | "2023-06-15T14:30:45" |