TemporalAmount 是表示时间跨度的接口,不能单独执行 plus 运算,必须通过 Temporal 对象(如 LocalDateTime)调用 plus(TemporalAmount) 方法实现累加;Duration 和 Period 均实现该接口,分别按时间线和日历单位叠加。

TemporalAmount 是 Java 时间 API 中表示时间跨度的接口,它本身不直接参与 plus 运算,而是通过被 Temporal(如 LocalDateTime、ZonedDateTime 等)调用 plus(TemporalAmount) 方法来实现累加。
TemporalAmount 不能单独做 plus 运算
它只是一个“量”的抽象,比如 Duration.ofHours(2) 或 Period.ofDays(5)。它没有起始时间,所以无法自己“加”出新时间。真正执行加法的是实现了 Temporal 的对象(如日期时间类),它们内部根据 TemporalAmount 类型决定如何叠加:
-
Duration:按纳秒精度叠加到时间线(适用于
Instant、LocalDateTime等) -
Period:按日历单位叠加(年/月/日,适用于
LocalDate、LocalDateTime)
正确用法:Temporal.plus(TemporalAmount)
把 TemporalAmount 作为参数传给时间对象的 plus 方法:
LocalDateTime now = LocalDateTime.now(); LocalDateTime later = now.plus(Duration.ofMinutes(90)); // 加 1.5 小时 LocalDateTime nextMonth = now.plus(Period.ofMonths(1)); // 加 1 个日历月
注意:Duration 和 Period 都实现了 TemporalAmount,所以可直接传入。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
自定义 TemporalAmount 的 plus 实现
如果自己实现 TemporalAmount,必须重写 addTo(Temporal) 方法——plus 内部实际调用的就是这个方法:
- 该方法接收一个
Temporal,返回叠加后的新Temporal - 不能修改原对象(所有时间类都是不可变的)
- 需判断传入的
Temporal类型,再做对应逻辑(如只支持LocalDateTime就抛UnsupportedTemporalTypeException)
常见误区提醒
以下写法是错误或无效的:
-
Duration.ofDays(1).plus(Duration.ofHours(2))——Duration的plus方法接受另一个Duration,不是TemporalAmount接口通用加法 -
someTime.plus(someAmount).plus(anotherAmount)没问题,但someAmount.plus(anotherAmount)不合法(接口没定义该方法) - 混用
Duration和Period:比如对LocalDateTime用Period.ofYears(1)没问题,但对Instant用Period会抛异常(Instant不支持日历单位)

















