我使用LocalDate
(ThreeTenABP)来计算给定日期之间的时间段。当我使用01/01/2018作为第一个日期和12/31/2018作为第二个日期时,Period.between
给出以下结果:
00 years
11 months
30 days
恕我直言,这是错误的,因为整整一年有12个月。
我试着添加一天。然后我得到:
00 years
11 months
31 days
我需要一种可靠的方法来获得给定时期内的实际月份。
答案 0 :(得分:1)
如果您查看Period.between()
的Javadoc,它会告诉您结束日期独占(意思是:未计算在内)。
包含开始日期,但结束日期不包括在内。通过删除完整的月份,然后计算剩余天数来计算期间,调整以确保两者具有相同的符号。
我编写了这段代码,它看起来像我期望的那样起作用......
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
的{{1}}代码:
plusDays()
如果您按照public Period plusDays(long daysToAdd) {
if (daysToAdd == 0) {
return this;
}
return create(years, months, Math.toIntExact(Math.addExact(days, daysToAdd)));
}
来电,它实际上只会在天数计数器中添加一天,它不会重新计算任何内容。要在一段时间内正确添加一天,请使用我上面的不同端点重新计算它。
答案 1 :(得分: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
Voilà,为期一年。在结束日期添加1天会使结束日期包含在内(因为现在它是结束日期之后的第二天)。