我使用LocalDate
(ThreeTenABP) 来计算给定日期之间的时间段。当我使用 01/01/2018 作为第一个日期和 12/31/2018 作为第二个日期时,Period.between
给出以下结果:
00 years
11 months
30 days
恕我直言,这是错误的,因为一整年有 12 个月。我试着加一天。然后我得到:
00 years
11 months
31 days
我需要一种可靠的方法来获得给定时期内完整月份的真实数量。
我使用LocalDate
(ThreeTenABP) 来计算给定日期之间的时间段。当我使用 01/01/2018 作为第一个日期和 12/31/2018 作为第二个日期时,Period.between
给出以下结果:
00 years
11 months
30 days
恕我直言,这是错误的,因为一整年有 12 个月。我试着加一天。然后我得到:
00 years
11 months
31 days
我需要一种可靠的方法来获得给定时期内完整月份的真实数量。
如果您查看 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
电话,它实际上只是在天数计数器上增加了一天,它不会重新计算任何东西。要正确地将一天添加到一个时期,请使用上面的不同端点重新计算它。
可靠的方法是:
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 天添加到结束日期会使结束日期包含在内(因为现在是结束日期后的第二天)。