java.util.Date
オブジェクトを新しい JDK 8/JSR-310 に変換する最適な方法は何ですかjava.time.LocalDate
?
Date input = new Date();
LocalDate date = ???
ベストアンサー1
短い答え
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Java 9の回答
Java SE 9では、新しい方法このタスクを少し簡素化する次の機能が追加されました。
Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());
この新しい代替手段はより直接的で、ゴミが少なくなるため、パフォーマンスが向上するはずです。
説明
名前に反して、java.util.Date
これは「日付」ではなく、タイムライン上の瞬間を表します。オブジェクト内に保存される実際のデータは、long
1970-01-01T00:00Z (1970 GMT/UTC 開始時の真夜中) からのミリ秒数です。
java.util.Date
JSR-310 のと同等のクラスはであるため、変換を提供するInstant
便利なメソッドがあります。toInstant()
Date input = new Date();
Instant instant = input.toInstant();
インスタンスjava.util.Date
にはタイムゾーンの概念がありません。はタイムゾーンに相対的であるため、toString()
で を呼び出すと奇妙に思えるかもしれません。ただし、そのメソッドは実際には Java のデフォルトのタイムゾーンをその場で使用して文字列を提供します。タイムゾーンは の実際の状態の一部ではありません。java.util.Date
toString
java.util.Date
には、Instant
タイムゾーンに関する情報も含まれていません。したがって、 をInstant
ローカル日付に変換するには、タイムゾーンを指定する必要があります。これは、デフォルトのゾーンである場合もあれば、ユーザー設定のタイムゾーンなど、アプリケーションが制御するタイムゾーンである場合もあります。タイムゾーンを適用するには、 メソッドZoneId.systemDefault()
を使用します。atZone()
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
には、ローカルの日付と時刻、タイムゾーン、GMT/UTC からのオフセットで構成される状態がZonedDateTime
含まれます。したがって、日付は次のようにLocalDate
簡単に抽出できますtoLocalDate()
。
Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();