将java.util.Date对象转换为新的JDK 8/JSR-310 java.time.LocalDate的最佳方法是什么?

Date input = new Date();
LocalDate date = ???

当前回答

这条简单的线有什么问题?

new LocalDateTime(new Date().getTime()).toLocalDate();

其他回答

LocalDate ld = new java.sql.Date( new java.util.Date().getTime() ).toLocalDate();

如果您正在使用ThreeTen Backport,包括ThreeTenABP

    Date input = new Date(); // Imagine your Date here
    LocalDate date = DateTimeUtils.toInstant(input)
            .atZone(ZoneId.systemDefault())
            .toLocalDate();

如果您正在使用JSR 310的后端端口,要么您没有Date.toInstant()方法,要么它不会为您提供进一步转换所需的org.threeten.bp.Instant。相反,您需要使用作为后端口一部分的DateTimeUtils类。转换的剩余部分是一样的,所以解释也是一样的。

首先,将日期转换为即时很容易

Instant timestamp = new Date().toInstant(); 

然后,你可以在jdk 8中使用ofInstant()方法将Instant转换为任何日期api:

LocalDateTime date = LocalDateTime.ofInstant(timestamp, ZoneId.systemDefault()); 

如果你正在使用Java 8, @JodaStephen的答案显然是最好的。然而,如果你使用的是JSR-310后端口,你不得不做这样的事情:

Date input = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(input);
LocalDate date = LocalDate.of(cal.get(Calendar.YEAR),
        cal.get(Calendar.MONTH) + 1,
        cal.get(Calendar.DAY_OF_MONTH));

你可以在一行中转换:

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