1. ホーム
  2. java

[解決済み] java.util.Dateをjava.time.LocalDateに変換する。

2022-03-18 04:09:13

質問

を変換する最も良い方法は何ですか? java.util.Date オブジェクトを新しいJDK 8/JSR-310の java.time.LocalDate ?

Date input = new Date();
LocalDate date = ???

解決方法は?

簡単な答え

Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

説明

その名前とは裏腹に java.util.Date は時間軸上の一瞬を表し、quot;date" ではありません。このオブジェクトに格納されている実際のデータは long 1970-01-01T00:00Z (1970年GMT/UTC開始の深夜) からのミリ秒のカウント。

と同等のクラスです。 java.util.Date は、JSR-310 では Instant という便利なメソッドがあります。 toInstant() を使用して、変換を行うことができます。

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

A java.util.Date インスタンスにはタイムゾーンの概念がありません。これは、もしあなたが toString() の上で java.util.Date というのは toString はタイムゾーンに対する相対値です。しかし、このメソッドは実際にはJavaのデフォルトのタイムゾーンをその場で使用して文字列を提供します。タイムゾーンは、実際には java.util.Date .

An Instant は、タイムゾーンの情報も含んでいない。したがって Instant をローカルな日付に変換するには、タイムゾーンを指定する必要があります。これは、デフォルトのゾーンであるかもしれません。 ZoneId.systemDefault() - あるいは、ユーザー設定のタイムゾーンなど、アプリケーションが制御するタイムゾーンを指定することもできます。タイムゾーンは atZone() メソッドを使用して、タイムゾーンを適用します。

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());

A ZonedDateTime は、ローカルの日付と時刻、タイムゾーン、GMT/UTCからのオフセットからなる状態を含んでいます。そのため、日付は LocalDate - を使えば、簡単に抽出することができます。 toLocalDate() :

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();

Java 9の回答

Java SE 9 では 新メソッド が追加され、この作業が若干簡略化されました。

Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());

この新しい選択肢は、より直接的で、ゴミの発生も少ないので、より良いパフォーマンスを発揮するはずです。