java.util.Date を java.time.LocalDate に変換する 質問する

java.util.Date を java.time.LocalDate に変換する 質問する

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これは「日付」ではなく、タイムライン上の瞬間を表します。オブジェクト内に保存される実際のデータは、long1970-01-01T00:00Z (1970 GMT/UTC 開始時の真夜中) からのミリ秒数です。

java.util.DateJSR-310 のと同等のクラスはであるため、変換を提供するInstant便利なメソッドがあります。toInstant()

Date input = new Date();
Instant instant = input.toInstant();

インスタンスjava.util.Dateにはタイムゾーンの概念がありません。はタイムゾーンに相対的であるため、toString()で を呼び出すと奇妙に思えるかもしれません。ただし、そのメソッドは実際には Java のデフォルトのタイムゾーンをその場で使用して文字列を提供します。タイムゾーンは の実際の状態の一部ではありません。java.util.DatetoStringjava.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();

おすすめ記事