Jak przekonwertować LocalDate na Instant?

106

Pracuję z nowym API DateTime w Javie 8.

Jak przekonwertować LocalDate na Instant? Mam wyjątek z

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

i nie rozumiem dlaczego.

user1643352
źródło
Ponieważ LocalDatenie zawiera czasu.
OrangeDog

Odpowiedzi:

100

InstantKlasa reprezentuje chwilową punkt na linii czasu. Konwersja do iz a LocalDatewymaga strefy czasowej. W przeciwieństwie do innych bibliotek daty i czasu, JSR-310 nie wybierze strefy czasowej automatycznie, więc musisz ją podać.

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

W tym przykładzie ZoneId.systemDefault()do wykonania konwersji użyto domyślnej strefy czasowej maszyny JVM - -. Zobacz tutaj, aby uzyskać dłuższą odpowiedź na powiązane pytanie.


Aktualizacja: Zaakceptowana odpowiedź używa LocalDateTime::toInstant(ZoneOffset)tylko akceptuje ZoneOffset. Ta odpowiedź używa, LocalDate::atStartOfDay(ZoneId)które akceptuje any ZoneId. Jako taka, ta odpowiedź jest generalnie bardziej użyteczna (i prawdopodobnie powinna być akceptowana).

PS. Byłem głównym autorem API

JodaStephen
źródło
1
Myślę, że jest to bardziej przydatne niż zaakceptowana odpowiedź, ponieważ ZoneId (strefa czasowa) jest parametrem, a nie ZoneOffset (godziny przesunięte z UTC, które mogą ulec zmianie dla strefy czasowej latem / zimą).
wuerg,
1
W teście jednostkowym, który piszę, mam LocalDate, która jest konwertowana na com.google.protobuf.Timestamp, a następnie odwzorowywana z powrotem na LocalDate za pomocą funkcji Instant, w obie strony. Korzystając z podejścia, które sugeruje zaakceptowana odpowiedź, otrzymuję w zamian oczekiwany LocalDate, ale użycie tego podejścia zwraca „wczoraj” zamiast „dzisiaj”. Moja
strefa
128

Aby przekonwertować go na instant musisz mieć instancję LocalDateTime, np:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
źródło
Wielkie dzięki. Rozumiem teraz, że muszę określić strefę czasową, aby uzyskać wyszukiwanie dynamiczne.
user1643352