在 Java 的时间宇宙里,有两个专门用来"丈量时间间隔"的角色,它们像两种不同的尺子,一个量"钟表时间",一个量"日期跨度"。主角就是:
👉
Duration和Period我带你拆开看,它们到底哪里不一样。
文章目录
-
- [一、Duration(时间间隔:精确到秒/纳秒 ⏱️)](#一、Duration(时间间隔:精确到秒/纳秒 ⏱️))
-
- [✅ 特点](#✅ 特点)
- [✅ 示例](#✅ 示例)
- [二、`Period`(日期间隔:年/月/日 📅)](#二、
Period(日期间隔:年/月/日 📅)) -
- [✅ 特点](#✅ 特点)
- [✅ 示例](#✅ 示例)
- 三、核心区别
- [四、举个直观例子 🌰](#四、举个直观例子 🌰)
- 五、常用方法
-
- [一、`Duration` 常用方法(时间流逝型 ⏱️)](#一、
Duration常用方法(时间流逝型 ⏱️)) -
- [1️⃣ 创建对象](#1️⃣ 创建对象)
- [2️⃣ 获取时间](#2️⃣ 获取时间)
- [3️⃣ 运算操作](#3️⃣ 运算操作)
- [4️⃣ 判断](#4️⃣ 判断)
- [5️⃣ 格式输出](#5️⃣ 格式输出)
- [二、`Period` 常用方法(日历跨度型 📅)](#二、
Period常用方法(日历跨度型 📅)) -
- [1️⃣ 创建对象](#1️⃣ 创建对象)
- [2️⃣ 获取时间](#2️⃣ 获取时间)
- [3️⃣ 运算操作](#3️⃣ 运算操作)
- [4️⃣ 判断](#4️⃣ 判断)
- [5️⃣ 规范化(很关键🔥)](#5️⃣ 规范化(很关键🔥))
- [6️⃣ 格式输出](#6️⃣ 格式输出)
- [一、`Duration` 常用方法(时间流逝型 ⏱️)](#一、
一、Duration(时间间隔:精确到秒/纳秒 ⏱️)
Duration 用来表示基于时间的间隔,适合描述"具体流逝了多少时间"。
✅ 特点
- 基于 秒(seconds)和纳秒(nanoseconds)
- 适合处理:
- 时、分、秒
- 精确时间计算
- 常用于:
- 接口超时
- 任务耗时统计
- 时间差计算
✅ 示例
java
Duration duration = Duration.between(startTime, endTime);
long seconds = duration.getSeconds(); // 总秒数
long millis = duration.toMillis(); // 转毫秒
二、Period(日期间隔:年/月/日 📅)
Period 用来表示基于日期的间隔,关注的是"日历上的跨度"。
✅ 特点
- 基于 年、月、日
- 不涉及具体时间(时分秒)
- 常用于:
- 年龄计算
- 日期差(多少天/多少个月)
- 账期、周期计算
✅ 示例
java
Period period = Period.between(startDate, endDate);
int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();
三、核心区别
| 对比点 | Duration | Period |
|---|---|---|
| 类型 | 时间间隔 | 日期间隔 |
| 精度 | 秒 / 纳秒 | 年 / 月 / 日 |
| 是否包含时间 | ✅ 包含(时分秒) | ❌ 不包含 |
| 适用对象 | LocalDateTime、Instant | LocalDate |
| 是否考虑月份长度 | ❌ 不关心 | ✅ 会考虑(28/30/31天) |
| 常见用途 | 耗时统计、超时控制 | 年龄、日期差 |
四、举个直观例子 🌰
假设:
2024-01-01 00:00 → 2024-01-02 00:00
用 Duration
👉 得到:86400秒
用 Period
👉 得到:1天
再来一个更有意思的:
2024-01-31 → 2024-02-28
用 Period
👉 结果:0个月28天(因为2月没有31号)
用 Duration
👉 结果:秒数差(固定值)
五、常用方法
一、Duration 常用方法(时间流逝型 ⏱️)
👉 适合:时 / 分 / 秒 / 纳秒
1️⃣ 创建对象
java
Duration.ofSeconds(60);
Duration.ofMinutes(10);
Duration.ofHours(2);
Duration.ofDays(1);
Duration.between(start, end);
2️⃣ 获取时间
java
duration.getSeconds(); // 总秒数
duration.toMillis(); // 转毫秒
duration.toMinutes(); // 转分钟
duration.toHours(); // 转小时
3️⃣ 运算操作
java
duration.plusSeconds(30); // 加30秒
duration.minusMinutes(5); // 减5分钟
duration.multipliedBy(2); // 乘2
duration.dividedBy(2); // 除2
4️⃣ 判断
java
duration.isNegative(); // 是否负数
duration.isZero(); // 是否为0
5️⃣ 格式输出
java
duration.toString(); // PT10M(ISO-8601格式)
👉 像:PT2H30M(2小时30分钟)
二、Period 常用方法(日历跨度型 📅)
👉 适合:年 / 月 / 日
1️⃣ 创建对象
java
Period.of(1, 2, 3); // 1年2月3天
Period.ofYears(2);
Period.ofMonths(6);
Period.ofDays(10);
Period.between(startDate, endDate);
2️⃣ 获取时间
java
period.getYears();
period.getMonths();
period.getDays();
⚠️ 注意:不是总天数,而是"拆分后的年月日"
3️⃣ 运算操作
java
period.plusDays(5);
period.minusMonths(2);
period.multipliedBy(2);
4️⃣ 判断
java
period.isZero();
period.isNegative();
5️⃣ 规范化(很关键🔥)
java
period.normalized();
👉 作用:把 15个月 → 1年3个月
6️⃣ 格式输出
java
period.toString(); // P1Y2M3D