Как конфертировать из Instant в LocalDate - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть Instant, поступивший из источника, который, согласно спецификации, должен быть LocalDate, но я не вижу никаких методов в LocalDate для преобразования. Каков наилучший способ сделать это?

Ответы [ 4 ]

0 голосов
/ 08 января 2019

При использовании Java 8 вы можете сделать следующее

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
0 голосов
/ 10 сентября 2018

LocalDate.ofInstant(...); Я считаю, что был добавлен в Java 9.

LocalDateTime имеет этот метод в Java 8.

yourInstant.atZone(yourZoneId).toLocalDate(); Будет работать с более ранними версиями для LocalDate ...

0 голосов
/ 02 декабря 2018

Другие ответы предоставили механику для преобразования, но я хотел бы добавить некоторую справку о значении такого преобразования, которое, надеюсь, поможет объяснить, почему оно работает так, как оно работает.


LocalDate и Instant кажутся похожими - они оба содержат информацию о дате (/ времени) без информации о часовом поясе. Однако они имеют совершенно другое значение.

Instant представляет однозначно момент времени. Представление явно не содержит никакого часового пояса, но неявно оно относится к временной шкале UTC.

LocalDateTimeLocalDate) неоднозначны, поскольку представляют точку на временной шкале local , которая косвенно ссылается на часовой пояс local .

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

Наконец, вы можете отбросить временную часть LocalDateTime и получить LocalDate.

0 голосов
/ 10 сентября 2018

Вы должны спросить себя, с каким смещением зоны вы хотите преобразовать его в наиболее вероятный и когда вы знаете ответ на этот вопрос:

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

РЕДАКТИРОВАТЬ

только что понял, что это возможно только после java-9, для пре-java9 см. другой ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...