Datum in LocalDate oder LocalDateTime konvertieren und zurück

Datum in LocalDate oder LocalDateTime und zurück konvertieren

1. Überblick

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 Datumsangaben aus beiden arbeiten.

Weitere Lektüre:

Migration auf die neue Java 8 Date Time API

Eine schnelle und praktische Anleitung zum Übergang zur neuen DateTime-API von Java 8.

Read more

Einführung in die Java 8 Date / Time API

In diesem Artikel werden wir einen Blick auf die neuen Java 8-APIs für Datum und Uhrzeit werfen und wie viel einfacher es ist, Datums- und Uhrzeitangaben zu erstellen und zu bearbeiten.

Read more

2. Konvertieren vonjava.util.Date injava.time.LocalDate

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

Hier können wir ein neuestoInstant() method which was added to java.util.Date in Java 8 nutzen.

Wenn wir einInstantobject, it’s required to use a ZoneId, because _ _Instant objects are timezone-agnostic konvertieren, zeigen Sie nur auf die Zeitachse.

DieatZone(ZoneId zone)-API ausInstant Objekt gibtZonedDateTime zurück, sodass wir nurLocalDate mit dertoLocalDate()-Methode daraus extrahieren müssen.

In unserem ersten Beispiel verwenden wir das StandardsystemZoneId:

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

A similar solution to the above one, but with a different way of creating an Instant object - mit der MethodeofEpochMilli():

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

Bevor wir fortfahren, werfen wir einen kurzen Blick auf die Klasseold java.sql.Dateund wie diese auch inLocalDatekonvertiert werden kann.

Ab Java 8 finden wir eine zusätzlichetoLocalDate()-Methode fürjava.sql.Date, die uns auch eine einfache Möglichkeit bietet, sie injava.time.LocalDate zu konvertieren.

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 das alteDate-Objekt in einLocalDateTime-Objekt konvertieren - schauen wir uns das als nächstes an.

3. Konvertieren vonjava.util.Date injava.time.LocalDateTime

Um eineLocalDateTime-Instanz zu erhalten, können wir auchan intermediary ZonedDateTime, and then using the toLocalDateTime() API verwenden.

Wie zuvor können wir zwei mögliche Lösungen verwenden, um einInstant-Objekt vonjava.util.Date zu erhalten:

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 ab Java 8 können wir auchuse java.sql.Timestamp to obtain a LocalDateTime:

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

4. Konvertieren Siejava.time.LocalDate injava.util.Date

Nachdem wir nun ein gutes Verständnis dafür haben, wie die alte Datendarstellung in die neue konvertiert wird, schauen wir uns die Konvertierung in die andere Richtung an.

Wir werden zwei mögliche Möglichkeiten zur Konvertierung vonLocalDate inDate diskutieren.

Im ersten verwenden wir ein neuesvalueOf(LocalDate date) method provided injava.sql.Date-Objekt, dasLocalDate 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. Die Umrechnung erfolgt in der lokalen Zeitzone (alles unter der Haube, kein Grund zur Sorge).

In einem anderen Java 8-Beispiel verwenden wir einInstant-Objekt, das wir an dasfrom(Instant instant)method ofjava.util.Date-Objekt übergeben:

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

Sie werden feststellen, dass wir hier einInstant-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 einLocalDateTime in einDate-Objekt zu konvertieren.

5. Konvertieren Siejava.time.LocalDateTime injava.util.Date

Der einfachste Weg,a java.util.Date from LocalDateTime is to use an extension to thejava.sql.Timestamp zu erhalten - 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 vonan Instant object – which we obtain from ZonedDateTime:

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 zwischenjava.util.Date undjava.time.LocalDate oderjava.time.LocalDateTime vereinfachen.

LocalDate.ofInstant(Instant instant, ZoneId zone) undLocalDateTime.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 Tutorial haben wir mögliche Möglichkeiten zum Konvertieren alterjava.util.Date in neuejava.time.LocalDate undjava.time.LocalDateTime und einen anderen Weg beschrieben.

Die vollständige Implementierung dieses Artikels ist inover on Github verfügbar.