1. Date → LocalDateTime / LocalDate / LocalTime

Date 本质上是一个时间戳,需要借助 Instant 和 ZoneId 转换:

import java.time.*;
import java.util.Date;

public class DateConvert {
    public static void main(String[] args) {
        Date date = new Date(); // 当前时间
        ZoneId zone = ZoneId.systemDefault(); // 系统默认时区

        // Date -> LocalDateTime
        LocalDateTime localDateTime = date.toInstant().atZone(zone).toLocalDateTime();
        System.out.println("LocalDateTime: " + localDateTime);

        // Date -> LocalDate
        LocalDate localDate = date.toInstant().atZone(zone).toLocalDate();
        System.out.println("LocalDate: " + localDate);

        // Date -> LocalTime
        LocalTime localTime = date.toInstant().atZone(zone).toLocalTime();
        System.out.println("LocalTime: " + localTime);
    }
}

2. LocalDateTime / LocalDate / LocalTime → Date

(1) LocalDateTime → Date

LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Date date = Date.from(localDateTime.atZone(zone).toInstant());
System.out.println("Date: " + date);

(2) LocalDate → Date

LocalDate 没有时间,需要补上时间(通常是一天的开始 00:00:00):

LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();
Date date = Date.from(localDate.atStartOfDay(zone).toInstant());
System.out.println("Date: " + date);

(3) LocalTime → Date

LocalTime 没有日期,需要和 LocalDate 拼接:

LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();

Date date = Date.from(LocalDateTime.of(localDate, localTime).atZone(zone).toInstant());
System.out.println("Date: " + date);

3. 小结

  • Date ↔ Instant 是桥梁。
  • 时区要用 ZoneId,否则会出现偏差。
  • LocalDateLocalTime 需要补充成 LocalDateTime 才能转 Date