0

我使用LocalDate(ThreeTenABP) 来计算给定日期之间的时间段。当我使用 01/01/2018 作为第一个日期和 12/31/2018 作为第二个日期时,Period.between给出以下结果:

00 years
11 months
30 days

恕我直言,这是错误的,因为一整年有 12 个月。我试着加一天。然后我得到:

00 years
11 months
31 days

我需要一种可靠的方法来获得给定时期内完整月份的真实数量。

4

2 回答 2

1

如果您查看 Javadoc 的Period.between(),它会告诉您结束日期是唯一的(意思是:不计算在内)。

包括开始日期,但不包括结束日期。周期的计算方法是删除完整的月份,然后计算剩余的天数,调整以确保两者具有相同的符号。

我编写了这段代码,它似乎可以按我的预期运行......

LocalDate d1 = LocalDate.of(2018, 1, 1);
LocalDate d2 = LocalDate.of(2018, 12, 31);
Period p1 = Period.between(d1, d2);
System.out.println(p1.getYears() + " years, " + p1.getMonths() + " months, " + p1.getDays() + " days");
// Prints: 0 years, 11 months, 30 days

添加一天,使其成为 2019-01-01,给了我一年:

LocalDate d3 = LocalDate.of(2019, 1, 1);
Period p2 = Period.between(d1, d3);
System.out.println(p2.getYears() + " years, " + p2.getMonths() + " months, " + p2.getDays() + " days");    
// Prints: 1 years, 0 months, 0 days

编辑

如果您只是将一天添加到计算Period对象,您实际上只是添加一天,而不是像between方法那样重新计算期间。Period这是其中的代码plusDays()

public Period plusDays(long daysToAdd) {
    if (daysToAdd == 0) {
        return this;
    }
    return create(years, months, Math.toIntExact(Math.addExact(days, daysToAdd)));
}

如果你听从create电话,它实际上只是在天数计数器上增加了一天,它不会重新计算任何东西。要正确地将一天添加到一个时期,请使用上面的不同端点重新计算它。

于 2018-01-20T18:26:35.913 回答
0

可靠的方法是:

    LocalDate begin = LocalDate.of(2018, Month.JANUARY, 1);
    LocalDate end = LocalDate.of(2018, Month.DECEMBER, 31);
    Period inclusive = Period.between(begin, end.plusDays(1));
    System.out.println(inclusive);

这打印

P1Y

瞧,为期一年。将 1 天添加到结束日期会使结束日期包含在内(因为现在是结束日期后的第二天)。

于 2018-01-20T22:50:27.943 回答