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.Date
reprezentuje natychmiast na linii czasu, a nie „datę”. Rzeczywiste dane przechowywane w obiekcie to long
liczba milisekund od 1970-01-01T00: 00Z (północ na początku 1970 GMT / UTC).
Klasa równoważna java.util.Date
w 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.Date
Instancja ma koncepcji strefy czasowej. Może się to wydawać dziwne, jeśli wywołujesz toString()
a java.util.Date
, ponieważ toString
dotyczy 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 Instant
także nie zawiera żadnych informacji o strefie czasowej. Tak więc, aby przekonwertować z Instant
lokalnej 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. LocalDateTime
ma 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 LocalDateTime
strefa czasowa jest określana przez wywołanie atZone(ZoneId)
metody. ZonedDateTime
Moż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 LocalDateTime
na ZonedDateTime
moż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.Date
do LocalDateTime
iz 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.Date
uż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.