在 java 的时间宇宙里,有两个专门用来“丈量时间间隔”的角色,它们像两种不同的尺子,一个量“钟表时间”,一个量“日期跨度”。主角就是:
👉duration和period
我带你拆开看,它们到底哪里不一样。
一、duration(时间间隔:精确到秒/纳秒 ⏱️)
duration 用来表示基于时间的间隔,适合描述“具体流逝了多少时间”。
✅ 特点
- 基于 秒(seconds)和纳秒(nanoseconds)
- 适合处理:
- 时、分、秒
- 精确时间计算
- 常用于:
- 接口超时
- 任务耗时统计
- 时间差计算
✅ 示例
duration duration = duration.between(starttime, endtime); long seconds = duration.getseconds(); // 总秒数 long millis = duration.tomillis(); // 转毫秒
二、period(日期间隔:年/月/日 📅)
period 用来表示基于日期的间隔,关注的是“日历上的跨度”。
✅ 特点
- 基于 年、月、日
- 不涉及具体时间(时分秒)
- 常用于:
- 年龄计算
- 日期差(多少天/多少个月)
- 账期、周期计算
✅ 示例
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️⃣ 创建对象
duration.ofseconds(60); duration.ofminutes(10); duration.ofhours(2); duration.ofdays(1); duration.between(start, end);
2️⃣ 获取时间
duration.getseconds(); // 总秒数 duration.tomillis(); // 转毫秒 duration.tominutes(); // 转分钟 duration.tohours(); // 转小时
3️⃣ 运算操作
duration.plusseconds(30); // 加30秒 duration.minusminutes(5); // 减5分钟 duration.multipliedby(2); // 乘2 duration.dividedby(2); // 除2
4️⃣ 判断
duration.isnegative(); // 是否负数 duration.iszero(); // 是否为0
5️⃣ 格式输出
duration.tostring(); // pt10m(iso-8601格式)
👉 像:pt2h30m(2小时30分钟)
二、period常用方法(日历跨度型 📅)
👉 适合:年 / 月 / 日
1️⃣ 创建对象
period.of(1, 2, 3); // 1年2月3天 period.ofyears(2); period.ofmonths(6); period.ofdays(10); period.between(startdate, enddate);
2️⃣ 获取时间
period.getyears(); period.getmonths(); period.getdays();
⚠️ 注意:不是总天数,而是“拆分后的年月日”
3️⃣ 运算操作
period.plusdays(5); period.minusmonths(2); period.multipliedby(2);
4️⃣ 判断
period.iszero(); period.isnegative();
5️⃣ 规范化(很关键🔥)
period.normalized();
👉 作用:把 15个月 → 1年3个月
6️⃣ 格式输出
period.tostring(); // p1y2m3d
到此这篇关于java8时间间隔类duration和period示例代码的文章就介绍到这了,更多相关java duration和period内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论