Другие ответы предоставили механику для преобразования, но я хотел бы добавить некоторую справку о значении такого преобразования, которое, надеюсь, поможет объяснить, почему оно работает так, как оно работает.
LocalDate
и Instant
кажутся похожими - они оба содержат информацию о дате (/ времени) без информации о часовом поясе. Однако они имеют совершенно другое значение.
Instant
представляет однозначно момент времени. Представление явно не содержит никакого часового пояса, но неявно оно относится к временной шкале UTC.
LocalDateTime
(и LocalDate
) неоднозначны, поскольку представляют точку на временной шкале local , которая косвенно ссылается на часовой пояс local .
Итак, для правильного преобразования Instant
в LocalDateTime
(концептуально - некоторые из этих шагов объединены в одну операцию в реализации) вам необходимо:
1. преобразовать Instant
в ZonedDateTime
, применив информацию о часовом поясе UTC
2. изменить часовой пояс с UTC на местный часовой пояс (что подразумевает применение соответствующего смещения часового пояса), что дает вам еще один ZonedDateTime
(с другим часовым поясом)
3. преобразовать ZonedDateTime
в LocalDateTime
, что делает часовой пояс неявным ( local ), удалив информацию о часовом поясе.
Наконец, вы можете отбросить временную часть LocalDateTime
и получить LocalDate
.