Krótka odpowiedź:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Objaśnienie: (na podstawie tego pytania o LocalDate)
Pomimo swojej nazwy, java.util.Datereprezentuje natychmiast na linii czasu, a nie „datę”. Rzeczywiste dane przechowywane w obiekcie to longliczba milisekund od 1970-01-01T00: 00Z (północ na początku 1970 GMT / UTC).
Klasa równoważna java.util.Datew JSR-310 jest Instant, dlatego istnieją wygodne metody zapewnienia konwersji do iz powrotem:
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
java.util.DateInstancja ma koncepcji strefy czasowej. Może się to wydawać dziwne, jeśli wywołujesz toString()a java.util.Date, ponieważ toStringdotyczy ono strefy czasowej. Jednak ta metoda faktycznie używa domyślnej strefy czasowej Javy w locie, aby podać ciąg. Strefa czasowa nie jest częścią rzeczywistego stanu java.util.Date.
A Instanttakże nie zawiera żadnych informacji o strefie czasowej. Tak więc, aby przekonwertować z Instantlokalnej daty i godziny, konieczne jest określenie strefy czasowej. Może to być strefa domyślna - ZoneId.systemDefault()- lub strefa czasowa kontrolowana przez aplikację, na przykład strefa czasowa z preferencji użytkownika. LocalDateTimema wygodną metodę fabryczną, która zajmuje zarówno strefę czasową, jak i strefę czasową:
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Odwrotnie LocalDateTimestrefa czasowa jest określana przez wywołanie atZone(ZoneId)metody. ZonedDateTimeMożna następnie przekształcić bezpośrednio do Instant:
LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());
Pamiętaj, że konwersja z LocalDateTimena ZonedDateTimemoże potencjalnie spowodować nieoczekiwane zachowanie. Wynika to z faktu, że nie każda lokalna data i godzina istnieją z powodu czasu letniego. Jesienią / jesienią zachodzi nakładanie się lokalnej linii czasowej, w której ta sama lokalna data i godzina występuje dwukrotnie. Wiosną jest przerwa, w której godzina znika. Zobacz Javadoc z, atZone(ZoneId)aby uzyskać więcej definicji konwersji.
Podsumowując, jeśli podróżujesz w obie strony java.util.Datedo LocalDateTimeiz powrotem java.util.Date, możesz skończyć z inną chwilą ze względu na czas letni.
Informacje dodatkowe: Jest jeszcze jedna różnica, która wpłynie na bardzo stare daty. java.util.Dateużywa kalendarza, który zmienia się 15 października 1582 r., z wcześniejszymi datami, używając kalendarza juliańskiego zamiast kalendarza gregoriańskiego. Dla kontrastu, java.time.*używa systemu kalendarza ISO (odpowiednik gregoriański) przez cały czas. W większości przypadków system kalendarzowy ISO jest tym, czego potrzebujesz, ale możesz zobaczyć dziwne efekty podczas porównywania dat sprzed 1582 roku.