Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

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);	// 結果:2016-08-19T17:14:22.12
    
    Instant instant = local.toInstant(ZoneOffset.of("+09:00"));
    Date date = Date.from(instant);
    System.out.println(date);	// 結果:Fri Aug 19 17:14:22 JST 2016

    Calendar cal = Calendar.getInstance();
    Instant instant2 = cal.toInstant();
    LocalDateTime local2 = LocalDateTime.ofInstant(instant2, ZoneId.of("Asia/Tokyo"));
    System.out.println(local2);	// 結果:2016-08-19T17:14:22.181
  }
}
日付/時刻(Date-Time API)
日付/時刻(Date-Time API)
now/of/parseメソッド
betweenメソッド
日時データを演算する
Date/Calendarクラス⇔DateTime-APIのクラスを相互変換する

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職