LocalDates 之间的期间产生错误的结果

问题描述 投票:0回答:1

我看到

java.time.Period
java.time.LocalDates
主要按需要工作,我可以用它来获取两个日期之间的持续时间,以年、月和日为单位,但我发现了一个不起作用的例子(不像我预期的那样),喜欢以下内容:

val test1 = LocalDate.of(2023, 1, 31)
val test2 = LocalDate.of(2023, 1, 28)
val testToday = LocalDate.of(2023, 3, 9)

val period1 = Period.between(test1, testToday)
val period2 = Period.between(test2, testToday)

L.d { "test1 = $test1 | test2 = $test2 | today = $testToday" }
L.d { "period1 = $period1 | period2 = $period2" }

输出如下:

period1 = P1M9D | period2 = P1M9D
test1 = 2023-01-31 | test2 = 2023-01-28 | today = 2023-03-09

问题

上面的解决方案告诉我以下内容:

  • 2023-01-31 和 2023-03-09 之间的持续时间 => 1 个月零 9 天 (P1M9D)
  • 2023-01-28 和 2023-03-09 之间的持续时间 => 1 个月零 9 天 (P1M9D)

=> 但这是错误的,第二个应该显示 3 天以上的持续时间......对此有解释吗?

localdate period
1个回答
0
投票

“问题”是

Period.between
执行计算的方式:

包括开始日期,但不包括结束日期。期间是 通过删除完整的月份,然后计算剩余的月份来计算 天数,调整以确保两者具有相同的符号。这 然后根据 12 将月数分成年和月 月年。如果月份的结束日更大,则考虑一个月 大于或等于每月的开始日期。例如,从 2010-01-15 到2011-03-18是一年两个月零三天

这导致 2023-01-28 到 2023-01-01 算作 1 个月零 1 天 (P1M1D),但 2023-01-29、30 和 31 也是如此。这是因为 2023-01-31 加 1月份是 2023-02-31,这是无效的,所以它使用 2023-02-28(29 和 30 相同,当然还有 28)。换句话说,有 1 个完整的月份,在 2023-02-28 结束,然后还有 9 天到 2023-03-09(不含)。

这符合为

LocalDate.plusMonths
记录的行为:

此方法分三步将指定金额添加到月份字段 步骤:

  1. 将输入月份添加到月份字段
  2. 检查结果日期是否无效
  3. 如有必要,将日期调整为最后一个有效日期

例如 2007-03-31 加上 1 个月将导致无效 日期 2007-04-31。最后一个不是返回无效结果,而是 而是选择该月的有效日期 2007-04-30。

© www.soinside.com 2019 - 2024. All rights reserved.