LocalDateをインスタントに変換する方法は?


106

Java 8の新しいDateTime APIを使用しています。

LocalDateをインスタントに変換する方法は?例外が発生します

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

理由がわかりません。


LocalDate時間は含まれていません。
OrangeDog 2016年

回答:


97

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にマップされます。受け入れられた回答が示唆するアプローチを使用すると、期待されるLocalDateが返されますが、このアプローチを使用すると、「今日」ではなく「昨日」が返されます。私のタイムゾーンはGMT + 1
Nadrendion

127

これをインスタントに変換するには、LocalDateTimeインスタンスが必要です。例:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

どうもありがとう。インスタントを取得するにはタイムゾーンを指定する必要があることを理解しました。
user1643352 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.