是否有用于此实现的现有 java 库?
这个问题与 Stack Overflow 无关。我不知道答案。所以我赶紧假装你问了一个编程问题。为您的计算编写一个方法并不难。
public static long daysBetween(LocalDate from, LocalDate to) {
if (to.isBefore(from)) {
throw new IllegalArgumentException();
}
if (from.getDayOfMonth() == 31) {
from = from.withDayOfMonth(30);
}
if (to.getDayOfMonth() == 31) {
to = to.withDayOfMonth(30);
}
long months = ChronoUnit.MONTHS.between(
YearMonth.from(from), YearMonth.from(to));
int daysSigned = to.getDayOfMonth() - from.getDayOfMonth();
return 30 * months + daysSigned;
}
我想向您展示其计算结果的几个示例。为此,我使用以下方法:
public static void tryItOut(LocalDate from, LocalDate to) {
long result = daysBetween(from, to);
System.out.format("%s - %s: %3d day/s%n", from, to , result);
}
然后这样称呼它:
tryItOut(LocalDate.of(2020, Month.FEBRUARY, 1), LocalDate.of(2020, Month.FEBRUARY, 20));
tryItOut(LocalDate.of(2020, Month.FEBRUARY, 1), LocalDate.of(2021, Month.FEBRUARY, 1));
tryItOut(LocalDate.of(2021, Month.FEBRUARY, 1), LocalDate.of(2021, Month.MARCH, 13));
tryItOut(LocalDate.of(2020, Month.JANUARY, 30), LocalDate.of(2020, Month.FEBRUARY, 1));
tryItOut(LocalDate.of(2020, Month.JANUARY, 31), LocalDate.of(2020, Month.FEBRUARY, 1));
tryItOut(LocalDate.of(2020, Month.JANUARY, 25), LocalDate.of(2020, Month.MARCH, 31));
tryItOut(LocalDate.of(2020, Month.MARCH, 30), LocalDate.of(2020, Month.MARCH, 31));
tryItOut(LocalDate.of(2020, Month.FEBRUARY, 29), LocalDate.of(2020, Month.MARCH, 1));
输出是:
2020-02-01 - 2020-02-20: 19 day/s
2020-02-01 - 2021-02-01: 360 day/s
2021-02-01 - 2021-03-13: 42 day/s
2020-01-30 - 2020-02-01: 1 day/s
2020-01-31 - 2020-02-01: 1 day/s
2020-01-25 - 2020-03-31: 65 day/s
2020-03-30 - 2020-03-31: 0 day/s
2020-02-29 - 2020-03-01: 2 day/s
为了将double 值传递给Apache POI,编写一个将LocalDate 转换为double 的方法可能并不难。但是那个库是用来访问 Excel 电子表格的,所以如果这不是您的需要,我想我不会打扰(Excel 可能是 Microsoft 的 TM)。
链接: Oracle tutorial: Date Time 解释如何使用 java.time。