LocalDate.plusMonths()基于日历月逻辑自动处理跨年和月份天数差异:①自动进位跨年,如2023-12-15加3月得2024-03-15;②月末日期智能对齐,如2023-01-31加1月得2023-02-28;③需注意边界截断,推荐用with(TemporalAdjusters.lastDayOfMonth())确保月末语义。

LocalDate.plusMonths() 会自动处理跨年和月份天数差异,无需手动干预,核心在于它基于“日历月”逻辑而非固定天数。
自动跨年:无需判断年份
当加法导致月份超出 12 时,plusMonths() 自动进位到下一年。例如:
- LocalDate.of(2023, 12, 15).plusMonths(3) → 2024-03-15
- LocalDate.of(2024, 1, 31).plusMonths(1) → 2024-02-29(因 2024 是闰年)
自动适配每月天数:月末日期智能对齐
若原日期在某月最后一天,而目标月天数更少,结果会自动取该月最后一天;若目标月天数更多,则保持原日序不变:
- LocalDate.of(2023, 1, 31).plusMonths(1) → 2023-02-28(2 月无 31 日,取最后一天)
- LocalDate.of(2023, 3, 31).plusMonths(-1) → 2023-02-28(同理回退也取当月末)
- LocalDate.of(2023, 1, 15).plusMonths(1) → 2023-02-15(15 日在 2 月存在,直接保留)
注意边界情况:避免意外截断
该方法不抛异常,但可能产生“非直觉”结果——尤其当起始日是大月末日、而目标月较小时:
立即学习“Java免费学习笔记(深入)”;
- LocalDate.of(2023, 10, 31).plusMonths(1) → 2023-11-30(11 月只有 30 天)
- 若业务要求严格按“相同日序”推进(如强制用 31 日),需额外校验并调整,例如用 withDayOfMonth() 配合 lengthOfMonth() 判断。
推荐组合用法:安全加月并保留月末语义
如需“加 N 个月后仍为当月最后一天”,可链式调用:
- LocalDate.now().withDayOfMonth(1).plusMonths(1).minusDays(1) → 先跳到下月 1 日,再减 1 天,确保得到目标月最后一天
- 或使用 TemporalAdjusters.lastDayOfMonth():LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth())


















