Java 8 推荐用 java.time 包进行日期加减,如 LocalDateTime.plusDays()、Period 处理年月日、Duration 处理时分秒,所有类不可变且线程安全,需保存返回新对象。

Java 中对日期进行加减运算,推荐使用 Java 8 引入的 java.time 包(如 LocalDateTime、ZonedDateTime、Period、Duration),它线程安全、不可变、语义清晰,彻底替代了旧的 Date 和 Calendar。
用 plus/minus 方法直接加减时间单位
所有主要的时间类都提供 plusXXX() 和 minusXXX() 方法,支持链式调用:
-
LocalDateTime.now().plusDays(5).minusHours(2)—— 加 5 天再减 2 小时 -
LocalDate.of(2024, 1, 15).plusMonths(3)→ 返回 2024-04-15 -
LocalTime.now().plusMinutes(90)—— 当前时间加 90 分钟
用 Period 处理“年月日”级别的加减(日历意义)
Period 表示基于日历的偏移量(如“2年3个月10天”),适用于 LocalDate 和 LocalDateTime:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
LocalDate.now().plus(Period.ofYears(1).ofMonths(6))-
Period.between(startDate, endDate)可计算两个日期间的年月日差 - 注意:
Period不适用于精确到秒的运算(不用它加减小时/分钟)
用 Duration 处理“时分秒纳秒”级别的加减(时间长度)
Duration 表示基于纳秒精度的连续时间段(如“3小时30分钟2.5秒”),适用于 LocalTime、LocalDateTime、ZonedDateTime:
立即学习“Java免费学习笔记(深入)”;
LocalDateTime.now().plus(Duration.ofHours(4).plusMinutes(30))-
Duration.between(start, end)计算两个时刻之间的纳秒差 - 跨时区场景建议用
ZonedDateTime配合Duration,避免夏令时歧义
注意时区和不可变性
所有 java.time 类都是不可变的,每次加减都会返回新对象,原对象不变:
- ❌ 错误写法:
date.plusDays(1);(结果未保存) - ✅ 正确写法:
date = date.plusDays(1);或newDate = date.plusDays(1); - 涉及时区转换时,优先用
ZonedDateTime而非LocalDateTime,防止丢失上下文

















