Java - DateをLocalDateTimeへ変換、LocalDateTimeをDateへ変換
java.util.Dateをjava.time.LocalDateTimeへ変換する方法について説明します。
DateをLocalDateTimeへ変換
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
LocalDateTimeをDateへ変換
一部のレガシーコードをサポートするために、この変換を使用することがあります。新規開発コードでは、あえて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は、Date、LocalDate、LocalDateTimeを相互に変換する静的メソッドを持つユーティリティクラスです。
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);
}
}