Date/Calendarクラス⇔DateTime-APIのクラスを相互変換する
Date/Calendarクラス⇔DateTime-APIのクラスを相互変換する- public static Date from(Instant instant) … Date
- public Instant toInstant() … Date/Calendar
- public static LocalDateTime ofInstant(Instant instant, ZoneId zone) … XxxxxDateTime
- instant:変換対象のインスタント
新しくDate-Time APIが導入されたとはいえ、いきなりすべてのコードをDate-Time APIで統一するのは現実的ではありません。当面は、従来のjava.utilパッケージと併用していくことになるでしょう。」
そこで、従来のDate/Calendarクラスに、Date-Time APIと相互変換するためのメソッドが用意されています。
Date#fromメソッドは、与えられたInstantオブジェクトからDateオブジェクトを生成します。Instantは、日付時刻を1970年1月1日からの経過時間で保持するクラスです。Date-Time APIの日付/時刻クラスは、それぞれtoInstantメソッドが用意されており、Instantオブジェクトを生成できるようになっていますので、これをfromメソッドに渡せばDateオブジェクトを生成できるというわけです(※)
※CalendarクラスにはDate#fromメソッドに相当するメソッドはありません。生成されたDateオブジェクトからCalendarオブジェクトを生成することになるでしょう。
Calendar/DateクラスにもtoInstantメソッドは用意されています。生成されたInstantオブジェクトをLocalDateTime/OffsetDateTime/ZonedDateTimeクラスのofInstantメソッドに渡すことで、それぞれ対応するオブジェクトを生成できます。
以下は、LocalDateTimeオブジェクトをDateオブジェクトに、CalendarオブジェクトをLocalDateTimeオブジェクトに、それぞれ変換する例です。
TimeTrans.java
package com.example.mynavi.datetime; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.util.Calendar; import java.util.Date; public class TimeTrans { public static void main(String[] args) { LocalDateTime local = LocalDateTime.now(); System.out.println(local); // 結果:2020-01-04T17:15:45.166806900 Instant instant = local.toInstant(ZoneOffset.of("+09:00")); Date date = Date.from(instant); System.out.println(date); // 結果:Sat Jan 04 17:15:45 JST 2020 Calendar cal = Calendar.getInstance(); Instant instant2 = cal.toInstant(); LocalDateTime local2 = LocalDateTime.ofInstant(instant2, ZoneId.of("Asia/Tokyo")); System.out.println(local2); // 結果:2020-01-04T17:15:45.185 } }