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

  1. Unveränderlichkeit: Alle java.time-Klassen sind unveränderlich und threadsicher
  2. Keine Zeitzoneninformationen: Stellt nur das lokale Datum und die lokale Uhrzeit dar
  3. Nanosekundengenauigkeit: Kann Zeit mit Nanosekundengenauigkeit darstellen
  4. Umfangreiche API: Bietet zahlreiche Methoden zur Datums- und Uhrzeitberechnung und -formatierung

Erstellen von LocalDateTime-Objekten

1. Verwenden von statischen Factory-Methoden

Beispiel

// Aktuelles Datum und aktuelle Uhrzeit abrufen
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

LocalDate date = LocalDate.of(2023, 5, 15);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

3. Zeichenketten parsen

Beispiel

LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:45");

Gängige Operationsmethoden

Abrufen von Datums- und Zeitkomponenten

Beispiel

LocalDateTime dateTime = LocalDateTime.now();

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

LocalDateTime dateTime = LocalDateTime.now();

// 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 dateTime1 = LocalDateTime.of(2023, 5, 15, 14, 30);
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

LocalDateTime dateTime = LocalDateTime.now();

// 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

LocalDateTime dateTime = LocalDateTime.now();

// 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

String str = "2023-05-15 14:30:45";
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

LocalDateTime dateTime = LocalDateTime.now();

LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();

Konvertierung mit Instant und ZonedDateTime

Beispiel

// Zeitzoneninformationen erforderlich
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 start = LocalDateTime.of(2023, 5, 15, 9, 0);
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 checkDate = LocalDateTime.of(2023, 5, 15, 14, 0);
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

LocalDateTime start = LocalDateTime.of(2023, 5, 1, 9, 0);
List<LocalDateTime> dateTimes = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    dateTimes.add(start.plusDays(i));
}

Umfassendes Beispiel

Beispiel

import java.time.LocalDateTime;
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

import java.time.*;

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:

  1. Wie man LocalDateTime-Objekte erstellt
  2. Wie man Berechnungen und Vergleiche mit Datum und Uhrzeit durchführt
  3. Wie man Datum und Uhrzeit formatiert und parst
  4. Wie man mit anderen Datum-Uhrzeit-Klassen konvertiert
  5. 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"
Weitere Erweiterungen