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

在 Java 的时间宇宙里,有两个专门用来"丈量时间间隔"的角色,它们像两种不同的尺子,一个量"钟表时间",一个量"日期跨度"。主角就是:

👉 DurationPeriod

我带你拆开看,它们到底哪里不一样。

文章目录

    • [一、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 用来表示基于时间的间隔,适合描述"具体流逝了多少时间"。

✅ 特点

  • 基于 秒(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

相关推荐
花和满楼3 小时前
K8s 1.36 ImageVolume GA:OCI 镜像不再只能跑容器
java·容器·kubernetes
头茬韭菜3 小时前
3.9 成本预警 — 退出钩子、$5 阈值对话框与多通道成本通知
java·大数据·jvm·ai
重庆小透明3 小时前
今日收获(一些个人思考)
java·spring·大模型·springai·prompt注入
Edward111111113 小时前
一AI名词
java·开发语言·数据库·学习
栈溢出了4 小时前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习
并不喜欢吃鱼4 小时前
从零开始 C++----- 十五.一文吃透 C++ 异常:try-catch、栈展开、自定义异常、异常安全 noexcept 底层全剖析
java·开发语言·jvm
智码看视界4 小时前
Day19 Spring Boot启动优化:启动时间从8秒降到2秒
java·spring boot·后端·启动优化
北京阿法龙科技有限公司4 小时前
AR智能眼镜安防应用核心指标:识别距离筑牢防线
java·开发语言·ar
殘殤血5 小时前
Tomcat的事件监听机制:观察者模式 _
java·观察者模式·tomcat
汤姆yu5 小时前
面向具身智能的物理视频模拟器:蚂蚁灵波LingBot-Video开源模型全解析
java·大数据·人工智能·gpt·开源·大模型·音视频