Как преобразовать LocalDate в Instant?

106

Я работаю с новым API DateTime Java 8.

Как преобразовать LocalDate в Instant? Я получаю исключение с

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

и я не понимаю почему.

user1643352
источник
Потому что a LocalDateне включает время.
OrangeDog

Ответы:

100

InstantКласс представляет собой мгновенную точку на временной линии. Преобразование в и из LocalDateтребует часового пояса. В отличие от некоторых других библиотек даты и времени, JSR-310 не выбирает часовой пояс автоматически, поэтому вы должны указать его.

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

В этом примере используется часовой пояс JVM по умолчанию - ZoneId.systemDefault()- для выполнения преобразования. См. Здесь более подробный ответ на связанный вопрос.


Обновление: принятый ответ использует LocalDateTime::toInstant(ZoneOffset)только тот, который принимает ZoneOffset. Этот ответ использует LocalDate::atStartOfDay(ZoneId)который принимает любые ZoneId. Таким образом, этот ответ обычно более полезен (и, вероятно, должен быть принятым).

PS. Я был основным автором API

ДжодаСтивен
источник
1
Я думаю, что это более полезно, чем принятый ответ, поскольку ZoneId (часовой пояс) является параметром, а не ZoneOffset (часы, сдвинутые с UTC, которые могут меняться для часового пояса летом / зимой).
wuerg
1
В модульном тесте, который я пишу, у меня есть LocalDate, который преобразуется в com.google.protobuf.Timestamp, а затем отображается обратно в LocalDate через Instant в обоих направлениях. При использовании подхода, предлагаемого принятым ответом, я получаю взамен ожидаемую LocalDate, но при использовании этого подхода я получаю «вчера» вместо «сегодня». Мой часовой пояс GMT + 1
Nadrendion
128

Чтобы преобразовать его в мгновение, вам необходимо иметь экземпляр LocalDateTime, например:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
источник
Большое спасибо. Теперь я понимаю, что мне нужно указать часовой пояс, чтобы получить мгновенное сообщение.
user1643352