Kurze Antwort:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Erklärung: (basierend auf dieser Frage über LocalDate
)
Stellt trotz seines Namens java.util.Date
einen Moment auf der Zeitachse dar, kein "Datum". Die tatsächlich im Objekt gespeicherten Daten sind long
Millisekunden seit 1970-01-01T00: 00Z (Mitternacht zu Beginn von 1970 GMT / UTC).
Die äquivalente Klasse zu java.util.Date
in JSR-310 ist Instant
, daher gibt es bequeme Methoden, um die Konvertierung hin und her bereitzustellen:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
Eine java.util.Date
Instanz hat kein Konzept der Zeitzone. Dies mag seltsam erscheinen , wenn Sie rufen toString()
auf ein java.util.Date
, weil die toString
relativ zu einer Zeitzone ist. Diese Methode verwendet jedoch tatsächlich die Standardzeitzone von Java im laufenden Betrieb, um die Zeichenfolge bereitzustellen. Die Zeitzone ist nicht Teil des aktuellen Zustands von java.util.Date
.
Ein Instant
enthält auch keine Informationen über die Zeitzone. Um von einer Instant
in eine lokale Datums- / Uhrzeitangabe zu konvertieren, muss daher eine Zeitzone angegeben werden. Dies kann die Standardzone sein - ZoneId.systemDefault()
- oder eine Zeitzone, die Ihre Anwendung steuert, z. B. eine Zeitzone aus den Benutzereinstellungen. LocalDateTime
verfügt über eine praktische Factory-Methode, die sowohl die Sofort- als auch die Zeitzone berücksichtigt:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Umgekehrt wird die LocalDateTime
Zeitzone durch Aufrufen der atZone(ZoneId)
Methode angegeben. Das ZonedDateTime
kann dann direkt in ein konvertiert werden Instant
:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Beachten Sie, dass die Konvertierung von LocalDateTime
nach ZonedDateTime
zu unerwartetem Verhalten führen kann. Dies liegt daran, dass aufgrund der Sommerzeit nicht jede lokale Datums- und Uhrzeitangabe vorhanden ist. Im Herbst / Herbst gibt es eine Überlappung in der lokalen Zeitleiste, in der dieselbe lokale Datums- und Uhrzeit zweimal vorkommt. Im Frühjahr gibt es eine Lücke, in der eine Stunde verschwindet. Weitere Informationen atZone(ZoneId)
zur Definition der Konvertierung finden Sie im Javadoc von .
Zusammenfassung: Wenn Sie eine Hin- und Rückfahrt java.util.Date
zu a LocalDateTime
und zurück zu a machen java.util.Date
, kann es aufgrund der Sommerzeit zu einem anderen Zeitpunkt kommen.
Zusätzliche Informationen: Es gibt einen weiteren Unterschied, der sich auf sehr alte Daten auswirkt. java.util.Date
verwendet einen Kalender, der sich am 15. Oktober 1582 ändert, wobei Daten davor den julianischen Kalender anstelle des gregorianischen Kalenders verwenden. Im Gegensatz dazu java.time.*
wird das ISO-Kalendersystem (entspricht dem Gregorianischen) für alle Zeiten verwendet. In den meisten Anwendungsfällen ist das ISO-Kalendersystem genau das, was Sie möchten. Beim Vergleich der Daten vor dem Jahr 1582 können jedoch merkwürdige Auswirkungen auftreten.