如何处理LocalDate Period.between结果?

时间:2018-01-20 18:17:50

标签: java android period localdate threetenbp

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

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

00 years
11 months
31 days

我需要一种可靠的方法来获得给定时期内的实际月份。

2 个答案:

答案 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天会使结束日期包含在内(因为现在它是结束日期之后的第二天)。