java - LocalDate.plus 错误答案
问题描述
plus(...)
当使用 long调用时,Java 的 LocalDate API 似乎给出了不正确的答案Period
,而我在其中遇到了一个错误。我在这里做错了吗?
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.ChronoUnit;
public class Main
{
public static void main(String[] args)
{
// Long Period
LocalDate birthA = LocalDate.of(1965, Month.SEPTEMBER, 27);
LocalDate eventA = LocalDate.of(1992, Month.MAY, 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 ????
// Short Period
LocalDate birthB = LocalDate.of(2012, Month.SEPTEMBER, 10);
LocalDate eventB = LocalDate.of(2012, Month.SEPTEMBER, 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
}
}
解决方案
APeriod
由若干年、月和日组成。在您的情况下,Period.between(birthA, eventA)
是 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));
That returns 2018-12-20
which I think is what you expected.
推荐阅读
- python - 移除 groupby 并优化 pandas 代码
- shortcut - 从文件打开开始菜单
- c# - C# 中 If/Else If 与 OR 运算符的性能
- postgresql - 设置 Postgresql。主版本和服务器版本不匹配
- winscp - 通配符搜索获取 Winscp 命令
- java - 使用 JPA 创建和使用数据库功能
- python - Python,Simpy:在执行另一个函数时暂停函数一段时间
- laravel-valet - Laravel 代客更改 php 版本在 mac os 上不起作用
- python - Python 上的网页抓取
- swiftui - 有没有办法在 SwiftUI 上禁用 onDelete 动画?