Period.getDays()返回的是日历期间中不足一月的剩余天数,非总天数差;应使用ChronoUnit.DAYS.between()直接计算两个LocalDate间的精确日历天数差。

Period.getDays 返回的是“日部分”,不是总天数差
Period.getDays() 获取的只是 Period 对象中“天”这一字段的值,它不等于两个日期相减后的总天数。比如 Period.of(1, 2, 5) 的 getDays() 是 5,和年、月完全无关。当你用 Period.between(start, end) 计算两个日期时,它会先按年-月-日对齐归约(类似“借位”),再把余下的天数填进 days 字段——所以这个值只反映“不足一月的剩余天数”,不是你想要的总天差。
想得到总天数差,别用 Period.getDays(),改用 ChronoUnit.DAYS.between()
这是最直接、无歧义的方式。它忽略年月概念,纯按日历天计算两个 LocalDate 之间的整数天数差:
LocalDate start = LocalDate.of(2023, 1, 15); LocalDate end = LocalDate.of(2023, 3, 10); long totalDays = ChronoUnit.DAYS.between(start, end); // → 54
- 结果恒为
long,支持负值(end在start前) - 不依赖
Period的归约逻辑,没有“月进位”干扰 - 性能好,底层是简单日序差值计算
如果非要从 Period 拆出总天数,得手动换算(不推荐)
你可以用 Period 的年、月、日字段,结合 LocalDate.plusYears().plusMonths().plusDays() 反推,但极易出错:
-
Period.between(LocalDate.of(2022, 1, 31), LocalDate.of(2022, 3, 3))得到P1M2D,getDays()是2,但实际天数差是31(1月31→2月28→3月3) - 涉及闰年、大小月时,
getMonths()和getDays()的组合无法线性换算成总天数 - 没有标准 API 支持这种“展开”,必须自己写逻辑校验月末边界,维护成本高
容易被忽略的关键点:Period 是“日历期间”,不是“时间跨度”
很多人误以为 Period 是一个精确的时间长度单位,其实它是面向人类日历语义的:1个月可能有28/29/30/31天,1年可能是365或366天。它的 getDays() 永远只代表“日历上最后没凑够一个月的零头”,不是度量意义上的天数。真要算天数,就该切换思维,用基于日序的 ChronoUnit.DAYS 或 Duration(后者需转为 Instant)。

















