提问人:DMP 提问时间:1/21/2018 最后编辑:AnonymousDMP 更新时间:1/21/2018 访问量:1010
如何处理 LocalDate Period.between 结果?
How to handle LocalDate Period.between results?
问:
我使用(ThreeTenABP)来计算给定日期之间的时间段。当我使用 01/01/2018 作为第一个日期和 12/31/2018 作为第二个日期时,给出以下结果:LocalDate
Period.between
00 years
11 months
30 days
恕我直言,这是错误的,因为一整年有 12 个月。 我试着加一天。然后我得到:
00 years
11 months
31 days
我需要一种可靠的方法来获取给定时期内完整月份的实际数量。
答:
1赞
Todd
1/21/2018
#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
plusDays()
public Period plusDays(long daysToAdd) {
if (daysToAdd == 0) {
return this;
}
return create(years, months, Math.toIntExact(Math.addExact(days, daysToAdd)));
}
如果你跟着电话,它实际上只是在天数计数器上增加了一天,它不会重新计算任何东西。要正确地将一天添加到期间,请使用不同的端点重新计算它,如上所述。create
评论
0赞
DMP
1/21/2018
感谢您的快速回答。我知道结束日期被排除在外,因此我尝试使用 .plusDays(1) 添加一天,但我仍然得到不同的结果。0 年零 11 个月零 31 天。
0赞
Anonymous
1/21/2018
#2
可靠的方法是:
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
瞧,一年的时间。在结束日期上添加 1 天可使结束日期包含(因为现在是结束日期之后的一天是独占的)。
评论