获取两个日期之间的天数差值

8

我使用java.time.Period#getDays()来获取给定LocalDate日期范围内的天数。

在大多数情况下,它似乎工作正常,但是对于整个月份,我得到零天的时间段。

以下测试用例失败(java.lang.AssertionError: expected:<30> but was:<0>):

@Test
public void testOneMonthPeriodDays() {
    Period p = Period.between(LocalDate.of(2017, 06, 01), LocalDate.of(2017, 07, 01));
    assertEquals(30, p.getDays());
}

我可以确认我看到了相同的结果。 - bhspencer
4
我打赌p.getMonths() == 1。Period 是年、月和日的计数。你的情况是一个月零天。 - GriffeyDog
3个回答

13

我相信这是正确的结果。如果你运行以下测试,你会发现 getMonths() 返回 1。看起来 getDays 不是获取总天数而是获取余数天数。

@Test
public void testOneMonthPeriodDays() {
    Period p = Period.between(LocalDate.of(2017, 06, 01), LocalDate.of(2017, 07, 01));
    assertEquals(0, p.getDays());
    assertEquals(1, p.getMonths());
}

要计算两个日期之间的总天数,请查看此问题:在Java 8中计算两个日期之间的天数

引用该问题中的答案:

LocalDate dateBefore;
LocalDate dateAfter;
long daysBetween = DAYS.between(dateBefore, dateAfter);

请注意,DAYSjava.time.temporal.ChronoUnit 枚举的成员。


2
既然问题已经存在,是不是最好直接显示指向那个问题的链接呢? - bhspencer
抱歉,我错过了答案的链接。同意。是的,我认为编辑后看起来更好。谢谢。 - Gray

7

java.time.Period#getDays()方法的JavaDoc说明:

返回此期间的天数,可能为负

我认为这个说明有误导之嫌,它并没有真正返回总天数。

我现在使用它

final long daysElapsed = ChronoUnit.DAYS.between(LocalDate.of(2017, 06, 01), LocalDate.of(2017, 07, 01));

正如预期的那样正常工作。


1
做以下操作:
long daysDifference = DAYS.between(dayInitial, dayAfter);

where:

LocalDate dateInitial;   //initial date
LocalDate dateAfter;      //later date

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接