Java - DateをLocalDateTimeへ変換、LocalDateTimeをDateへ変換

java.util.Dateをjava.time.LocalDateTimeへ変換する方法について説明します。

DateLocalDateTimeへ変換

Date.getTime()メソッドは、1970年1月1日00:00:00 GMT以降に経過したミリ秒であるepoch millisecondを返します。LocalDateTimeを取得するには、まずユーザー位置のzone offset情報を設定し、指定されたzone offsetでInstantを取得できるようにする必要があります。

その後、ローカルタイムライン上で、指定されたInstantと同じ年、月、日、時刻を持つLocalDateTimeを返すInstant.toLocalDateTime()メソッドを使用できます。

package com.devkuma.basic.datetime.convert;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class ConvertDateToLocalDateTime {

    public static void main(String[] args) {
        Date todayDate = new Date();

        LocalDateTime localDateTime = Instant.ofEpochMilli(todayDate.getTime())
                                             .atZone(ZoneId.systemDefault())
                                             .toLocalDateTime();

        System.out.println(localDateTime);
    }
}

実行結果:

2023-04-17T21:17:05.753

LocalDateTimeDateへ変換

一部のレガシーコードをサポートするために、この変換を使用することがあります。新規開発コードでは、あえてDateクラスを使用する理由はありません。

package com.devkuma.basic.datetime.convert;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class ConvertDateToLocalDateTime {

    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();

        Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

        System.out.println(date);
    }
}

実行結果:

Mon Apr 17 21:16:54 KST 2023

ユーティリティクラス

以下のDateUtilsは、DateLocalDateLocalDateTimeを相互に変換する静的メソッドを持つユーティリティクラスです。

package com.devkuma.basic.datetime.convert;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public final class DateUtils {

    private DateUtils() {}

    public static Date toDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    public static Date toDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    public static LocalDate toLocalDate(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
    }

    public static LocalDateTime toLocalDateTime(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
}

このユーティリティクラスを使用するには、静的メソッドに正しい引数を渡して呼び出すだけです。

package com.devkuma.basic.datetime.convert;

import java.time.LocalDateTime;
import java.util.Date;

public final class UseDateUtils {

    public static void main(String[] args) {
        Date date = DateUtils.toDate(LocalDateTime.now());

        System.out.println(date);

        LocalDateTime localDateTime = DateUtils.toLocalDateTime(date);

        System.out.println(localDateTime);
    }
}