java8新特性 时间间隔类 Duration和Period

张开发
2026/4/14 3:00:02 15 分钟阅读

分享文章

java8新特性 时间间隔类 Duration和Period
在 Java 的时间宇宙里有两个专门用来“丈量时间间隔”的角色它们像两种不同的尺子一个量“钟表时间”一个量“日期跨度”。主角就是Duration和Period我带你拆开看它们到底哪里不一样。文章目录一、Duration时间间隔精确到秒/纳秒 ⏱️✅ 特点✅ 示例二、Period日期间隔年/月/日 ✅ 特点✅ 示例三、核心区别四、举个直观例子 五、常用方法一、Duration 常用方法时间流逝型 ⏱️1️⃣ 创建对象2️⃣ 获取时间3️⃣ 运算操作4️⃣ 判断5️⃣ 格式输出二、Period 常用方法日历跨度型 1️⃣ 创建对象2️⃣ 获取时间3️⃣ 运算操作4️⃣ 判断5️⃣ 规范化很关键6️⃣ 格式输出一、Duration时间间隔精确到秒/纳秒 ⏱️Duration用来表示基于时间的间隔适合描述“具体流逝了多少时间”。✅ 特点基于 秒seconds和纳秒nanoseconds适合处理时、分、秒精确时间计算常用于接口超时任务耗时统计时间差计算✅ 示例DurationdurationDuration.between(startTime,endTime);longsecondsduration.getSeconds();// 总秒数longmillisduration.toMillis();// 转毫秒二、Period日期间隔年/月/日 Period用来表示基于日期的间隔关注的是“日历上的跨度”。✅ 特点基于年、月、日不涉及具体时间时分秒常用于年龄计算日期差多少天/多少个月账期、周期计算✅ 示例PeriodperiodPeriod.between(startDate,endDate);intyearsperiod.getYears();intmonthsperiod.getMonths();intdaysperiod.getDays();三、核心区别对比点DurationPeriod类型时间间隔日期间隔精度秒 / 纳秒年 / 月 / 日是否包含时间✅ 包含时分秒❌ 不包含适用对象LocalDateTime、InstantLocalDate是否考虑月份长度❌ 不关心✅ 会考虑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);// 乘2duration.dividedBy(2);// 除24️⃣ 判断duration.isNegative();// 是否负数duration.isZero();// 是否为05️⃣ 格式输出duration.toString();// PT10MISO-8601格式 像PT2H30M2小时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

更多文章