LocalDate.plus错误答案

时间:2019-05-10 15:19:21

标签: java java-8 localdate off-by-one

Java的LocalDate API调用带有长plus(...)的{​​{1}}时似乎给出了错误的答案,这是我犯了一个错误。我在这里做错什么了吗?

Period

2 个答案:

答案 0 :(得分:21)

test.c: In function ‘main’: test.c:18:9: error: lvalue required as unary ‘&’ operand t = &(X(a, s)); ^ 由很多年,几个月和几天组成。对于您来说,Period是26岁7个月12天。

如果将其添加到Period.between(birthA, eventA),则会得到:

  • 1965 + 26年-> 1991
  • 1991年9月+ 7个月-> 1991年4月
  • 1991年4月27日+ 12天-> 1992年5月9日

按预期工作。

如果应用相同的计算,从1992年5月9日开始,您将获得2018年12月21日。

如果要添加一定天数,则不能简单地添加期限(因为年份和月份并不总是相同的长度)。一种选择是改为使用birthA

ChonoUnit.DAYS.between

返回LocalDate halfA = eventA.plusDays(ChronoUnit.DAYS.between(birthA, eventA)); ,我认为这是您所期望的。

答案 1 :(得分:7)

为补充亚述的答案,下面是一个简化的示例来说明为什么会发生这种情况:

    public static void main(String[] args)
    {
        LocalDate a = LocalDate.of(1992, Month.APRIL, 1);
        LocalDate b = LocalDate.of(1992, Month.MAY, 1);
        // Calculate the period. It will return "One month"
        Period period = Period.between(a, b);
        // Add one month to b. It will return June 1, 1992
        LocalDate c = b.plus(period);
        System.out.println(ChronoUnit.DAYS.between(a, b)); // 30 days as April has 30 days
        System.out.println(ChronoUnit.DAYS.between(b, c)); // 31 days as May has 31 days
    }