仕様によれば、LocalDateであるはずのソースからのインスタントがありますが、LocalDateには変換のためのメソッドが表示されません。これを行う最良の方法は何ですか?
LocalDate.ofInstant(...);
Java 9.に追加されたと思われます。
LocalDateTimeには、Java 8にそのメソッドがあります。
yourInstant.atZone(yourZoneId).toLocalDate();
LocalDateの以前のバージョンで動作します...
他の答えは変換の仕組みを提供しましたが、そのような変換の意味についての背景を追加したいと思います。
LocalDate
とInstant
は類似しているようです。どちらもタイムゾーン情報なしで日付(/時刻)情報を保持しています。しかし、それらはまったく異なる意味を持っています。
Instant
は、特定の時点を明確に表します。表現にはタイムゾーンが明示的に含まれていませんが、暗黙的にUTCタイムラインを参照します。
LocalDateTime
(およびLocalDate
)は、localタイムラインのポイントを表すため、あいまいです。これは、暗黙的にlocalタイムゾーンを参照します。
したがって、Instant
をLocalDateTime
に正しく変換するには(概念的には、これらのステップのいくつかは実装で1つの操作にまとめられます)、次のことが必要です。
1。 UTCタイムゾーン情報を適用して、Instant
をZonedDateTime
に変換します
2。タイムゾーンをUTCからlocalタイムゾーン(関連するタイムゾーンオフセットを適用することを意味します)に変更すると、別のZonedDateTime
(異なるタイムゾーンで)が得られます
3。 ZonedDateTime
をLocalDateTime
に変換します。これにより、タイムゾーン情報が削除され、タイムゾーンが暗黙的になります(local)。
最後に、LocalDateTime
の時間部分を削除して、LocalDate
で終わることができます。
Java 8を使用している場合、次のことができます。
Instant instantOfNow = Instant.now();
LocalDate localDate
= LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
最も可能性の高いゾーンオフセットに変換するゾーンオフセットと、その答えがわかったときに、自分で確認する必要があります。
LocalDate.ofInstant(yourInstant, yourZoneOffSet)
編集
これはJava-9以降でのみ可能であることを認識しました。Java9以前の場合は、 他の答え を参照してください