Java LocalDate.plus错误答案

Java LocalDate.plus错误答案,java,java-8,localdate,off-by-one,Java,Java 8,Localdate,Off By One,Java的LocalDate API在调用plus(…)时给出的答案似乎不正确,调用时的周期很长,在这里我得到了一个错误。我做错什么了吗 import java.time.LocalDate; 导入java.time.Month; 导入java.time.Period; 导入java.time.temporal.ChronoUnit; 公共班机 { 公共静态void main(字符串[]args) { //长期 LocalDate birthA=LocalDate.of(1965年9月27日);

Java的LocalDate API在调用
plus(…)
时给出的答案似乎不正确,调用时的
周期很长,在这里我得到了一个错误。我做错什么了吗

import java.time.LocalDate;
导入java.time.Month;
导入java.time.Period;
导入java.time.temporal.ChronoUnit;
公共班机
{
公共静态void main(字符串[]args)
{
//长期
LocalDate birthA=LocalDate.of(1965年9月27日);
LocalDate eventA=LocalDate.of(1992年5月9日);
LocalDate halfA=eventA.plus(Period.between(birthA,eventA));
System.out.println(halfA);//2018-12-21????
System.out.println(ChronoUnit.DAYS.between(birthA,eventA));//9721
System.out.println(ChronoUnit.DAYS.between(eventA,halfA));//9722????
//短期
LocalDate birthB=LocalDate.of(2012年9月10日);
LocalDate eventB=LocalDate.of(2012年9月12日);
LocalDate halfB=eventB.plus(Period.between(birthB,eventB));
System.out.println(halfB);//2018-09-14
System.out.println(ChronoUnit.DAYS.between(birthB,eventB));//2
System.out.println(ChronoUnit.DAYS.between(eventB,halfB));//2
}
}

A
期间
由若干年、月和日组成。在您的情况下,
期间。介于(生日、事件)之间的时间是26年7个月零12天

如果将其添加到
birthA
,您将获得:

  • 1965年+26年->1991年
  • 1991年9月+7个月->1991年4月
  • 1991年4月27日+12天->1992年5月9日
这和预期的一样

如果你采用同样的计算方法,从1992年5月9日开始,你将得到2018年12月21日

如果你想增加一定的天数,你不能简单地增加周期(因为年和月并不总是有相同的长度)。一种选择是使用
ChonoUnit.DAYS.between

LocalDate halfA = eventA.plusDays(ChronoUnit.DAYS.between(birthA, eventA));

这将返回
2018-12-20
,我认为这正是您所期望的。

为了补充assylias的答案,这里有一个简单的示例来说明为什么会发生这种情况:

publicstaticvoidmain(字符串[]args)
{
LocalDate a=LocalDate.of(1992年4月1日);
LocalDate b=LocalDate.of(1992年5月1日);
//计算期间。它将返回“一个月”
期间=介于(a,b)之间的期间;
//给b加上一个月。它将在1992年6月1日返回
LocalDate c=b.plus(期间);
System.out.println(ChronoUnit.DAYS.between(a,b));//30天,因为四月有30天
System.out.println(ChronoUnit.DAYS.between(b,c));//31天,因为五月有31天
}

啊,这让我终于明白了
句号
到底是什么!