Java中创建时间间隔主要用Period类,它表示基于年月日的日历周期,适合处理“3个月”“15天”等人可读时间段;Period不可变,仅含年、月、日字段,提供ofDays()、ofMonths()、ofYears()等静态工厂方法及of(years,months,days)组合创建方式,常与LocalDate配合做智能日期计算,区别于基于纳秒的Duration。

Java 中创建时间间隔(如几天、几个月)主要用 Period 类,它表示基于年月日的日历周期,适合处理“3个月”“15天”这类人可读的时间段。注意:Period.ofDays() 和 Period.ofMonths() 是静态工厂方法,直接返回 Period 实例,不是构造器调用。
用 ofDays()、ofMonths()、ofYears() 快速创建
这些是 Period 提供的便捷静态方法,适用于单一单位的间隔:
-
Period.ofDays(7)→ 表示“7天”,等价于Period.of(0, 0, 7) -
Period.ofMonths(3)→ 表示“3个月”,等价于Period.of(0, 3, 0) -
Period.ofYears(2)→ 表示“2年”,等价于Period.of(2, 0, 0)
它们返回的 Period 对象不可变,且只记录年、月、日三个字段(时分秒不在此类中处理,那是 Duration 的职责)。
组合多个单位:用 of() 或 builder 风格
如果需要同时表达“2年3个月15天”,推荐用 Period.of(int years, int months, int days):
立即学习“Java免费学习笔记(深入)”;
-
Period.of(2, 3, 15)→ 明确指定年月日,语义清晰 - 避免链式调用误区:比如
Period.ofMonths(3).ofDays(10)❌ 不生效,因为每个ofXxx()都新建对象,前一个会被丢弃
和 LocalDate 配合做日期计算
Period 常用于日期加减,它会智能处理不同月份天数差异(比如 1 月 31 日 + 1 个月 = 2 月 28/29 日):
LocalDate start = LocalDate.of(2024, 1, 31);LocalDate end = start.plus(Period.ofMonths(1)); // 得到 2024-02-29- 反向计算:用
ChronoUnit.MONTHS.between(d1, d2)得整数月,但若需精确日历差(含年月日),用Period.between(d1, d2)
别和 Duration 混用
Period 是日历概念(考虑闰年、大小月),Duration 是精确时间量(基于纳秒,适合小时/分钟/秒):
- 要“加 5 小时” → 用
Duration.ofHours(5) - 要“加 5 天” → 用
Period.ofDays(5)(更符合业务语义,如生日提醒、合同期) - 两者不能互相转换,类型不同,用途不同


















