web-dev-qa-db-ja.com

Java8 Java.util.DateからJava.time.ZonedDateTimeへの変換

Java.util.DateJava.time.LocalDateに変換しようとすると、次の例外が発生します。

Java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: 2014-08-19T05:28:16.768Z of type Java.time.Instant

コードは次のとおりです。

public static Date getNearestQuarterStartDate(Date calculateFromDate){

    int[] quaterStartMonths={1,4,7,10};     
    Date startDate=null;

    ZonedDateTime d=ZonedDateTime.from(calculateFromDate.toInstant());
    int frmDateMonth=d.getMonth().getValue();

ZonedDateTimeクラスの使用方法に何か問題がありますか?

ドキュメントに従って、これはJava.util.DateオブジェクトをZonedDateTimeに変換する必要があります。上記の日付形式は標準の日付ですか?

Joda時間にフォールバックする必要がありますか?

誰かが何か提案を提供できれば、それは素晴らしいことです。

58
Ironluca

InstantZonedDateTimeに変換するために、ZonedDateTimeはメソッド ZonedDateTime.ofInstant(Instant, ZoneId) を提供します。そう

したがって、デフォルトのタイムゾーンでZonedDateTimeが必要だと仮定すると、コードは

ZonedDateTime d = ZonedDateTime.ofInstant(calculateFromDate.toInstant(),
                                          ZoneId.systemDefault());
84
JB Nizet

DateからZonedDateTimeを取得するには、次を使用できます。

calculateFromDate.toInstant().atZone(ZoneId.systemDefault())

LocalDateが必要な場合は、toLocalDateメソッドを呼び出すことができます。参照: Java.util.DateをJava.time.LocalDateに変換

32
assylias

Java 10 UTCでutil.Dateを保存する場合、答えは私にはうまくいきませんでした。

Date.toInstant()は、EpochMillisをサーバーのローカルタイムゾーンに変換するようです。

ZDT.ofInstant(instant、zoneId)およびinstant.atZone(zoneId)は、瞬時にTZにタグ付けするように見えますが、すでに台無しになっています。

Date.toInstant()がシステムタイムゾーンのUTC時間を混乱させないようにする方法が見つかりませんでした。

これを回避するために見つけた唯一の方法は、sql.Timestampクラスを調べることでした。

new Java.sql.Timestamp(date.getTime()).toLocalDateTime()
                                      .atZone(ZoneId.of("UTC"))
                                      .withZoneSameInstant(desiredTZ)
0
TheArchitect