目录
- 前言
- 1. 基本知识
- 2. Demo
- 3. 拓展Demo
前言
基本的Java知识推荐阅读:
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
- 【Java项目】实战CRUD的功能整理(持续更新)
1. 基本知识
Duration 类是 Java 8 引入的时间类,用于在秒和纳秒的精度上表示时间间隔
主要用于描述两个时间点之间的时间长度,可以在多种时间单位(天、小时、分钟、秒、毫秒等)进行表示和操作
常见的API方法如下:
方法 | 说明 |
---|---|
Duration.ofDays(long) | 创建以天为单位的 Duration 实例 |
Duration.ofHours(long) | 创建以小时为单位的 Duration 实例 |
Duration.ofMinutes(long) | 创建以分钟为单位的 Duration 实例 |
Duration.ofSeconds(long) | 创建以秒为单位的 Duration 实例 |
Duration.ofMillis(long) | 创建以毫秒为单位的 Duration 实例 |
Duration.ofNanos(long) | 创建以纳秒为单位的 Duration 实例 |
Duration.parse(CharSequence) | 从ISO-8601格式的字符串中解析出 Duration |
plus(Duration) | 返回一个在当前 Duration 基础上加上指定 Duration 的新实例 |
minus(Duration) | 返回一个在当前 Duration 基础上减去指定 Duration 的新实例 |
multipliedBy(long) | 将 Duration 按指定倍数扩展 |
dividedBy(long) | 将 Duration 按指定值分割 |
toDays() | 将 Duration 转换为天数 |
toHours() | 将 Duration 转换为小时数 |
toMinutes() | 将 Duration 转换为分钟数 |
toMillis() | 将 Duration 转换为毫秒数 |
toNanos() | 将 Duration 转换为纳秒数 |
2. Demo
常见的场景如下:
- 表示天数的时间间隔
Duration duration = Duration.ofDays(5);
System.out.println("5天的时间间隔为: " + duration);
// 输出:5天的时间间隔为: PT120H
- 表示小时数的时间间隔
Duration duration = Duration.ofHours(3);
System.out.println("3小时的时间间隔为: " + duration);
// 输出:3小时的时间间隔为: PT3H
- 将时间间隔转换为其他单位
Duration duration = Duration.ofHours(10);
long minutes = duration.toMinutes();
System.out.println("10小时转换为分钟: " + minutes);
// 输出:10小时转换为分钟: 600
- 时间间隔相加
Duration duration1 = Duration.ofMinutes(30);
Duration duration2 = Duration.ofMinutes(45);
Duration total = duration1.plus(duration2);
System.out.println("30分钟加45分钟: " + total);
// 输出:30分钟加45分钟: PT1H15M
- 通过字符串解析 Duration
Duration duration = Duration.parse("PT2H30M");
System.out.println("解析的时间间隔: " + duration);
// 输出:解析的时间间隔: PT2H30M
- 动态配置缓存过期时间 根据传入的时间单位配置缓存过期时间,可以灵活设置缓存条目的过期时间
String ttlStr = "5h"; // 示例输入,可以替换为动态值
Duration duration = parseDuration(ttlStr);
System.out.println("缓存过期时间为: " + duration);
// 根据ttlStr的值,将解析后的Duration应用到缓存配置中
完整的Demo如下:
package Duration知识;import java.time.Duration;public class DurationDemo {public static void main(String[] args) {// 示例输入,可以替换为不同的字符串表示的时间String ttlStr1 = "5d"; // 5天String ttlStr2 = "3h"; // 3小时String ttlStr3 = "15m"; // 15分钟String ttlStr4 = "45s"; // 45秒String ttlStr5 = "120"; // 默认秒数// 调用自定义解析方法并打印结果applyCacheConfig(ttlStr1);applyCacheConfig(ttlStr2);applyCacheConfig(ttlStr3);applyCacheConfig(ttlStr4);applyCacheConfig(ttlStr5);}// 模拟缓存配置的方法private static void applyCacheConfig(String ttlStr) {Duration duration = parseDuration(ttlStr);System.out.println("解析的缓存过期时间 (" + ttlStr + "): " + duration);// 假设这是缓存配置的过程,将Duration设置为缓存的过期时间// cacheConfig.entryTtl(duration);}// 自定义解析字符串的时间方法private static Duration parseDuration(String ttlStr) {// 获取时间单位(最后一位字符)String timeUnit = ttlStr.substring(ttlStr.length() - 1);long timeValue = removeDurationSuffix(ttlStr);switch (timeUnit) {case "d":return Duration.ofDays(timeValue);case "h":return Duration.ofHours(timeValue);case "m":return Duration.ofMinutes(timeValue);case "s":return Duration.ofSeconds(timeValue);default:return Duration.ofSeconds(Long.parseLong(ttlStr)); // 默认秒单位}}// 移除时间单位后缀并转换为数值private static long removeDurationSuffix(String ttlStr) {return Long.parseLong(ttlStr.substring(0, ttlStr.length() - 1));}
}
截图如下:
package Duration知识;import java.time.Duration;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;public class DurationExample {public static void main(String[] args) {// 创建开始和结束时间LocalDateTime start = LocalDateTime.of(2024, 11, 20, 14, 30, 0);LocalDateTime end = LocalDateTime.of(2024, 11, 21, 16, 45, 15);// 使用Duration.between计算时间差Duration duration = Duration.between(start, end);// 输出时间差的各个单位值System.out.println("相差的天数: " + duration.toDays());System.out.println("相差的小时: " + duration.toHours());System.out.println("相差的分钟: " + duration.toMinutes());System.out.println("相差的秒数: " + duration.getSeconds());System.out.println("相差的毫秒: " + duration.toMillis());System.out.println("相差的纳秒: " + duration.toNanos());// Duration 的其他方法System.out.println("是否为负数: " + duration.isNegative());System.out.println("相差时间的绝对值(纳秒): " + duration.abs().toNanos());System.out.println("Duration转换为字符串: " + duration.toString());// 使用ChronoUnit直接计算差值System.out.println("相差的天数 (ChronoUnit): " + ChronoUnit.DAYS.between(start, end));System.out.println("相差的小时 (ChronoUnit): " + ChronoUnit.HOURS.between(start, end));System.out.println("相差的分钟 (ChronoUnit): " + ChronoUnit.MINUTES.between(start, end));}
}
截图如下:
3. 拓展Demo
多个时间差计算的简短示例
- 计算两个日期间的小时差
LocalDateTime start = LocalDateTime.of(2023, 3, 14, 9, 0);
LocalDateTime end = LocalDateTime.of(2023, 3, 14, 18, 30);
long hoursDifference = Duration.between(start, end).toHours();
System.out.println("小时差: " + hoursDifference); // 输出:小时差: 9
- 计算分钟差并转成小时和分钟格式
LocalDateTime start = LocalDateTime.of(2023, 5, 10, 10, 15);
LocalDateTime end = LocalDateTime.of(2023, 5, 10, 13, 45);
Duration duration = Duration.between(start, end);
System.out.println("小时: " + duration.toHours() + " 分钟: " + (duration.toMinutes() % 60));
// 输出:小时: 3 分钟: 30
- 计算两个时间的绝对值差距
LocalDateTime start = LocalDateTime.of(2024, 1, 1, 8, 30);
LocalDateTime end = LocalDateTime.of(2023, 12, 31, 23, 30);
Duration duration = Duration.between(start, end).abs();
System.out.println("相差的天数 (绝对值): " + duration.toDays());
// 输出:相差的天数 (绝对值): 1
- 使用 ChronoUnit 快速计算时间差
LocalDateTime start = LocalDateTime.of(2023, 6, 1, 12, 0);
LocalDateTime end = LocalDateTime.of(2023, 6, 3, 12, 0);
long days = ChronoUnit.DAYS.between(start, end);
System.out.println("相差的天数 (ChronoUnit): " + days); // 输出:相差的天数 (ChronoUnit): 2
这些示例展示 Duration 和 ChronoUnit 的不同用法,可以轻松实现时间差的计算