Java中plusDays()和minusMonths()基于不可变时间类,返回新对象;plusDays()加减天数并自动处理跨月跨年,minusMonths()按日历月减且对月末日期退至当月最后一天。

Java 中使用 plusDays() 和 minusMonths() 增减日期时间,核心是基于不可变的现代时间类(如 LocalDateTime、LocalDate、ZonedDateTime),每次调用都会返回一个新对象,原对象不受影响。
plusDays():加减天数(简单直接)
适用于 LocalDate、LocalDateTime、ZonedDateTime 等。参数为正数表示往后推,负数表示往前推。
-
LocalDate.now().plusDays(7)→ 当前日期加 7 天 -
LocalDateTime.of(2024, 1, 31, 10, 0).plusDays(-5)→ 往前推 5 天,结果是 2024-01-26T10:00 - 跨月/跨年自动处理:比如 2024-01-30 加 5 天 → 2024-02-04,无需手动判断月份天数
minusMonths():减去月份(注意月末边界行为)
常用在 LocalDate 和 LocalDateTime 上。它按“日历月”减,不是固定天数,且对月末日期有特殊规则:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
LocalDate.of(2024, 3, 15).minusMonths(1)→ 2024-02-15 -
LocalDate.of(2024, 3, 31).minusMonths(1)→ 2024-02-29(因为 2 月没有 31 日,自动退到当月最后一天) -
LocalDate.of(2024, 1, 31).minusMonths(1)→ 2023-12-31(12 月有 31 日,正常保留)
组合使用与注意事项
多个时间单位可链式调用,但要注意顺序和类型匹配:
立即学习“Java免费学习笔记(深入)”;
- 支持混合操作:
LocalDateTime.now().plusDays(3).minusMonths(2).plusHours(5) - 不能混用不兼容类型:比如
LocalDate没有plusHours(),需先转成LocalDateTime再操作 - 所有方法都返回新对象,务必接收返回值,否则修改“丢失”:
❌ 错误写法:date.plusDays(1); // date 本身没变
✅ 正确写法:date = date.plusDays(1);
替代方案:Period 和 TemporalAdjusters(更灵活场景)
如果需要动态增减或复用逻辑,可考虑:
-
Period.ofMonths(2)+plus(period):适合封装重复的时间偏移 -
with(TemporalAdjusters.lastDayOfMonth()):配合增减后做归一化(如确保结果是月末) - 需要精确到秒级偏移?用
Duration(如plus(Duration.ofDays(1)))

















