在Java8 Date API中将持续时间转换为年份?

Ski*_*kip 2 java duration date java-8 java-time

我有一个远在过去的约会.
我发现了这个日期和现在之间的持续时间.
现在我想知道 - 多年来这是多少?

我使用Java8 API提出了这个解决方案.
这是一个可怕的解决方案,因为我必须首先手动将持续时间转换为Days,因为UnsupportedTemporalTypeException否则会有- 否则LocalDate.plus(SECONDS)不支持任何原因.
即使编译器允许此调用.

转换Duration成年份的可能性是否较低?

LocalDate dateOne = LocalDate.of(1415, Month.JULY, 6);
Duration durationSinceGuss1 = Duration.between(LocalDateTime.of(dateOne, LocalTime.MIDNIGHT),LocalDateTime.now());

long yearsSinceGuss = ChronoUnit.YEARS.between(LocalDate.now(), 
        LocalDate.now().plus(
                TimeUnit.SECONDS.toDays(
                        durationSinceGuss1.getSeconds()), 
                ChronoUnit.DAYS) );

/*
 * ERROR - 
 * LocalDate.now().plus(durationSinceGuss1) causes an Exception. 
 * Seconds are not Supported for LocalDate.plus()!!!
 * WHY OR WHY CAN'T JAVA DO WHAT COMPILER ALLOWS ME TO DO?
 */
//long yearsSinceGuss = ChronoUnit.YEARS.between(LocalDate.now(), LocalDate.now().plus(durationSinceGuss) );

/*
 * ERROR - 
 * Still an exception! 
 * Even on explicitly converting duration to seconds. 
 * Everything like above. Seconds are just not allowed. Have to convert them manually first e.g. to Days?!
 * WHY OR WHY CAN'T YOU CONVERT SECONDS TO DAYS OR SOMETHING AUTOMATICALLY, JAVA?
 */
//long yearsSinceGuss = ChronoUnit.YEARS.between(LocalDate.now(), LocalDate.now().plus(durationSinceGuss.getSeconds(), ChronoUnit.SECONDS) );
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 6

你尝试过使用LocalDateTimeDateTime代替LocalDate吗?按照设计,后者不支持小时/分钟/秒/等,因此UnsupportedTemporalTypeException当你尝试添加秒数时.

例如,这有效:

LocalDateTime dateOne = LocalDateTime.of(1415, Month.JULY, 6, 0, 0);
Duration durationSinceGuss1 = Duration.between(dateOne, LocalDateTime.now());
long yearsSinceGuss = ChronoUnit.YEARS.between(LocalDateTime.now(), LocalDateTime.now().plus(durationSinceGuss1) );
System.out.println(yearsSinceGuss); // prints 600
Run Code Online (Sandbox Code Playgroud)


JVo*_*Von 5

用于Period获取两个对象之间的年数LocalDate

    LocalDate before    = LocalDate.of(1415, Month.JULY, 6);
    LocalDate now       = LocalDate.now();
    Period    period    = Period.between(before, now);

    int yearsPassed     = period.getYears();

    System.out.println(yearsPassed);
Run Code Online (Sandbox Code Playgroud)