web-dev-qa-db-ja.com

InstantからLocalDateに変換する方法

仕様によれば、LocalDateであるはずのソースからのインスタントがありますが、LocalDateには変換のためのメソッドが表示されません。これを行う最良の方法は何ですか?

13
JL Gradley

LocalDate.ofInstant(...); Java 9.に追加されたと思われます。

LocalDateTimeには、Java 8にそのメソッドがあります。

yourInstant.atZone(yourZoneId).toLocalDate(); LocalDateの以前のバージョンで動作します...

29
Rob C

他の答えは変換の仕組みを提供しましたが、そのような変換の意味についての背景を追加したいと思います。


LocalDateInstantは類似しているようです。どちらもタイムゾーン情報なしで日付(/時刻)情報を保持しています。しかし、それらはまったく異なる意味を持っています。

Instantは、特定の時点を明確に表します。表現にはタイムゾーンが明示的に含まれていませんが、暗黙的にUTCタイムラインを参照します。

LocalDateTime(およびLocalDate)は、localタイムラインのポイントを表すため、あいまいです。これは、暗黙的にlocalタイムゾーンを参照します。

したがって、InstantLocalDateTimeに正しく変換するには(概念的には、これらのステップのいくつかは実装で1つの操作にまとめられます)、次のことが必要です。
1。 UTCタイムゾーン情報を適用して、InstantZonedDateTimeに変換します
2。タイムゾーンをUTCからlocalタイムゾーン(関連するタイムゾーンオフセットを適用することを意味します)に変更すると、別のZonedDateTime(異なるタイムゾーンで)が得られます
3。 ZonedDateTimeLocalDateTimeに変換します。これにより、タイムゾーン情報が削除され、タイムゾーンが暗黙的になります(local)。

最後に、LocalDateTimeの時間部分を削除して、LocalDateで終わることができます。

9

Java 8を使用している場合、次のことができます。

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
5
Robbo_UK

最も可能性の高いゾーンオフセットに変換するゾーンオフセットと、その答えがわかったときに、自分で確認する必要があります。

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

編集

これはJava-9以降でのみ可能であることを認識しました。Java9以前の場合は、 他の答え を参照してください

3
Eugene