Konvertieren Sie das Datum in LocalDate oder LocalDateTime und zurück

1. Übersicht

Ab Java 8 haben wir eine neue Datums- API: java.time .

Manchmal müssen wir jedoch noch Konvertierungen zwischen der neuen und der alten API durchführen und mit Datumsdarstellungen von beiden arbeiten.

2. Konvertieren von java.util.Date in java.time.LocalDate

Beginnen wir mit der Konvertierung der alten Datumsdarstellung in die neue.

Hier können wir eine neue toInstant () -Methode nutzen, die in Java 8 zu java.util.Date hinzugefügt wurde .

Wenn wir ein Instant- Objekt konvertieren , muss eine ZoneId verwendet werden, weilSofortige Objekte sind zeitzonenunabhängig - nur Punkte auf der Zeitachse.

Die atZone (ZoneId zone) -API aus dem Instant- Objekt gibt eine ZonedDateTime zurück , sodass wir nur LocalDate mit der toLocalDate () -Methode daraus extrahieren müssen .

Zunächst verwenden wir die Standardsystem- ZoneId :

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); }

Und eine ähnliche Lösung, jedoch mit einer anderen Methode zum Erstellen eines Instant- Objekts - mithilfe der ofEpochMilli () -Methode:

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); }

Bevor wir fortfahren, werfen wir einen kurzen Blick auf die alte java.sql.Date- Klasse und wie diese auch in ein LocalDate konvertiert werden kann .

Beginnend mit Java 8 können wir zusätzlich finden toLocalDate () Methode auf java.sql.Date , die uns auch die Umwandlung in eine einfache Möglichkeit gibt java.time.LocalDate .

In diesem Fall müssen wir uns keine Gedanken über die Zeitzone machen:

public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); }

In ähnlicher Weise können wir auch ein altes Date- Objekt in ein LocalDateTime- Objekt konvertieren . Schauen wir uns das als nächstes an.

3. Konvertieren von java.util.Date in java.time.LocalDateTime

Um eine LocalDateTime- Instanz abzurufen , können wir in ähnlicher Weise einen ZonedDateTime- Vermittler verwenden und dann die toLocalDateTime () -API verwenden .

Wie zuvor können wir zwei mögliche Lösungen verwenden, um ein Instant- Objekt von java.util.Date abzurufen :

public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }

Und beginnend mit Java 8, können wir auch verwenden java.sql.Timestamp ein erhalten Local :

ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { return new java.sql.Timestamp( dateToConvert.getTime()).toLocalDateTime(); }

4. Konvertieren Sie java.time.LocalDate in java.util.Date

Nachdem wir nun ein gutes Verständnis für die Konvertierung von der alten in die neue Datendarstellung haben, schauen wir uns die Konvertierung in die andere Richtung an.

Wir werden zwei mögliche Möglichkeiten zum Konvertieren von LocalDate in Date diskutieren .

Im ersten Fall verwenden wir eine neue valueOf- Methode (LocalDate date) , die im Objekt java.sql.Date bereitgestellt wird und LocalDate als Parameter verwendet:

public Date convertToDateViaSqlDate(LocalDate dateToConvert) { return java.sql.Date.valueOf(dateToConvert); }

Wie wir sehen können, ist es mühelos und intuitiv. Für die Konvertierung wird die lokale Zeitzone verwendet (alles erfolgt unter der Haube, sodass Sie sich keine Sorgen machen müssen).

In einem anderen Java 8-Beispiel verwenden wir ein Instant- Objekt, das wir an die from- Methode (Instant instant) des Objekts java.util.Date übergeben :

public Date convertToDateViaInstant(LocalDate dateToConvert) { return java.util.Date.from(dateToConvert.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); }

Beachten Sie, dass wir hier ein Instant- Objekt verwenden und dass wir bei dieser Konvertierung auch die Zeitzonen berücksichtigen müssen.

Als nächstes verwenden wir eine sehr ähnliche Lösung, um eine LocalDateTime in ein Date- Objekt zu konvertieren .

5. Konvertieren Sie java.time.LocalDateTime in java.util.Date

Der einfachste Weg, ein java.util.Date von LocalDateTime abzurufen, ist die Verwendung einer Erweiterung des java.sql.Timestamp - verfügbar mit Java 8:

public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { return java.sql.Timestamp.valueOf(dateToConvert); }

Eine alternative Lösung ist natürlich die Verwendung eines Instant- Objekts, das wir von ZonedDateTime erhalten :

Date convertToDateViaInstant(LocalDateTime dateToConvert) { return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) .toInstant()); }

6. Java 9-Ergänzungen

In Java 9 stehen neue Methoden zur Verfügung, die die Konvertierung zwischen java.util.Date und java.time.LocalDate oder java.time.LocalDateTime vereinfachen .

LocalDate.ofInstant (Instant Instant, ZoneId-Zone) und LocalDateTime.ofInstant (Instant Instant, ZoneId-Zone) bieten praktische Verknüpfungen:

public LocalDate convertToLocalDate(Date dateToConvert) { return LocalDate.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); } public LocalDateTime convertToLocalDateTime(Date dateToConvert) { return LocalDateTime.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); }

7. Fazit

In diesem Artikel haben wir mögliche Möglichkeiten zum Konvertieren von altem java.util.Date in neues java.time.LocalDate und java.time.LocalDateTime sowie umgekehrt behandelt.

Die vollständige Implementierung dieses Artikels ist auf GitHub verfügbar.