注目記事

【Javaコード入門】日付/時刻(Date-Time API)_⑥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はJava 8で導入された比較的新しいAPIで、まだまだ既存のコードにはCalendar/Dateクラス(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

  1. package com.example.mynavi.datetime;
  2.  
  3. import java.time.Instant;
  4. import java.time.LocalDateTime;
  5. import java.time.ZoneId;
  6. import java.time.ZoneOffset;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9.  
  10. public class TimeTrans {
  11.   public static void main(String[] args) {
  12.     var local = LocalDateTime.now();
  13.     System.out.println(local);  // 結果:2025-01-10T23:05:04.383990
  14.      
  15.     var instant = local.toInstant(ZoneOffset.of("+09:00"));
  16.     var date = Date.from(instant);
  17.     System.out.println(date);   // 結果:Fri Jan 10 23:05:04 JST 2025
  18.  
  19.     var cal = Calendar.getInstance();
  20.     var instant2 = cal.toInstant();
  21.     var local2 = LocalDateTime.ofInstant(instant2, ZoneId.of("Asia/Tokyo"));
  22.     System.out.println(local2); // 結果:2025-01-10T23:05:04.398
  23.   }
  24. }
日付/時刻(Date-Time API)_目次
日付/時刻(Date-Time API)
now/of/parseメソッド
formatメソッド
betweenメソッド
日時データを演算する
Date/Calendarクラス⇔DateTime-APIのクラスを相互変換する

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。