java日期增减用plus/minus方法,基于不可变对象设计,返回新实例;需选对时间单位和类(localdate、localdatetime等),period处理年月日复合偏移,duration处理秒级精度,zoneddatetime自动处理夏令时。

Java中用plus和minus方法增减日期,核心是基于不可变对象的设计——每次调用都返回新实例,原对象不变。关键在于选对时间单位(如Days、Months)和搭配正确的类(LocalDate、LocalDateTime等)。
用plus/minus增减天数、月数或年数
对日期做简单偏移时,直接使用预定义的单位最安全。例如:
-
LocalDate.now().plusDays(7):加7天 -
LocalDateTime.now().minusMonths(1):减1个月(自动处理不同月份天数差异) -
LocalDate.of(2023, 1, 31).plusMonths(1)→ 返回2023-02-28(不是31日,因2月无31日)
用Period配合plus/minus处理复合偏移
当需要同时加2年3个月5天时,用Period更清晰:
LocalDate.now().plus(Period.ofYears(2).plusMonths(3).plusDays(5))-
Period.between(start, end)可反向计算两个日期的年月日差,再用于增减 - 注意:
Period只适用于LocalDate和LocalDateTime,不支持Instant
用Duration处理精确到秒/毫秒的偏移
若需加减小时、分钟、秒或毫秒,优先用Duration(基于纳秒精度):
LocalDateTime.now().plus(Duration.ofHours(2))Instant.now().minus(Duration.ofSeconds(30))- 避免混用:
Duration不能传给LocalDate(无时间信息),否则编译报错
小心时区与夏令时带来的影响
涉及ZonedDateTime时,plus/minus会自动处理夏令时切换:
-
ZonedDateTime.of(..., ZoneId.of("Europe/Berlin"))加1小时,若恰逢夏令时开始,可能跳过一小时 - 如需严格按“墙上时间”加减(忽略时钟跳变),用
withLaterOffsetAtOverlap()或withEarlierOffsetAtOverlap()调整策略 - 纯时间运算建议先转为
Instant,操作完再转回带时区的时间
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











