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.Dateeinen Moment auf der Zeitachse dar, kein "Datum". Die tatsächlich im Objekt gespeicherten Daten sind longMillisekunden seit 1970-01-01T00: 00Z (Mitternacht zu Beginn von 1970 GMT / UTC).
Die äquivalente Klasse zu java.util.Datein 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.DateInstanz hat kein Konzept der Zeitzone. Dies mag seltsam erscheinen , wenn Sie rufen toString()auf ein java.util.Date, weil die toStringrelativ 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 Instantenthält auch keine Informationen über die Zeitzone. Um von einer Instantin 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. LocalDateTimeverfü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 LocalDateTimeZeitzone durch Aufrufen der atZone(ZoneId)Methode angegeben. Das ZonedDateTimekann 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 LocalDateTimenach ZonedDateTimezu 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.Datezu a LocalDateTimeund 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.Dateverwendet 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.