period用于localdate间日历周期差计算,得年月日而非总天数;不支持带时分秒类型;需注意月末对齐与不可变性。

Java 中使用 Period 类计算两个日期的**年、月、日间隔**,适用于 LocalDate 类型,不能用于带时分秒的日期时间(如 LocalDateTime 或 ZonedDateTime)。它的结果是“日历周期差”,不是精确的总天数。
1. Period 基于 LocalDate 计算年月日差值
Period 表示的是两个 LocalDate 之间的年、月、日数量,按日历规则推算(比如 1 月 31 日到 2 月 28 日是 1 个月,不是 28 天)。
- 用
Period.between(startDate, endDate)静态方法获取 - 起始日期必须早于或等于结束日期;否则返回负的年/月/日(如
P-1M) - 不考虑时区、夏令时、闰秒等,只看年月日字段
2. 基本用法示例
计算 2022 年 3 月 15 日到 2024 年 7 月 20 日之间相隔多久:
LocalDate start = LocalDate.of(2022, 3, 15); LocalDate end = LocalDate.of(2024, 7, 20); Period period = Period.between(start, end); System.out.println(period); // P2Y4M5D System.out.println(period.getYears()); // 2 System.out.println(period.getMonths()); // 4 System.out.println(period.getDays()); // 5
注意:它不是简单减法(比如不等于 2 年 4 个月零 5 天 = 总共多少天),而是日历对齐后的“跨度”。
3. 注意事项和常见误区
-
不能传入 LocalDateTime:会编译报错。需先用
.toLocalDate()截断时间部分 -
不等于总天数:若要总天数,改用
ChronoUnit.DAYS.between(start, end) -
月末日期需小心:例如从 1 月 31 日到 3 月 31 日,
Period算作 2 个月;但 1 月 31 日到 2 月 28 日(非闰年)算作 1 个月,getDays()是 0 —— 因为 2 月没有 31 日,自动调整到月末 -
不可变对象:
Period实例创建后不可修改,所有 withXxx() 方法都返回新实例
4. 实用小技巧:格式化输出或加减日期
你可以把 Period 应用到某个日期上,做日历加减:
-
localDate.plus(period)或localDate.minus(period) - 自定义格式化:拼接字符串,如
period.getYears() + "年" + period.getMonths() + "个月" + period.getDays() + "天" - 检查是否为零:用
period.isZero()判断两个日期是否相同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











