详细分析Java8中的Duration时间类基本知识(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 拓展Demo

前言

基本的Java知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【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

常见的场景如下:

  1. 表示天数的时间间隔
Duration duration = Duration.ofDays(5);
System.out.println("5天的时间间隔为: " + duration);
// 输出:5天的时间间隔为: PT120H
  1. 表示小时数的时间间隔
Duration duration = Duration.ofHours(3);
System.out.println("3小时的时间间隔为: " + duration);
// 输出:3小时的时间间隔为: PT3H
  1. 将时间间隔转换为其他单位
Duration duration = Duration.ofHours(10);
long minutes = duration.toMinutes();
System.out.println("10小时转换为分钟: " + minutes);
// 输出:10小时转换为分钟: 600
  1. 时间间隔相加
Duration duration1 = Duration.ofMinutes(30);
Duration duration2 = Duration.ofMinutes(45);
Duration total = duration1.plus(duration2);
System.out.println("30分钟加45分钟: " + total);
// 输出:30分钟加45分钟: PT1H15M
  1. 通过字符串解析 Duration
Duration duration = Duration.parse("PT2H30M");
System.out.println("解析的时间间隔: " + duration);
// 输出:解析的时间间隔: PT2H30M
  1. 动态配置缓存过期时间 根据传入的时间单位配置缓存过期时间,可以灵活设置缓存条目的过期时间
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

多个时间差计算的简短示例

  1. 计算两个日期间的小时差
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
  1. 计算分钟差并转成小时和分钟格式
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
  1. 计算两个时间的绝对值差距
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
  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 的不同用法,可以轻松实现时间差的计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8032.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Day14买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如…

【星闪EBM-H63开发板】小熊派的开发板实物

前几天介绍了,我参加了小熊派的星闪EBM-H63开发板内测活动。今天去快递站取回来开发板,让我们看看实物照片。 下面是开发板的正面照片,绿色的部分是核心板,蓝色的部分实际上是个底板,引出了串口的管脚,再加…

zookeeper的选举机制

zk中有两种角色:Leader 和 Fllower Leader是自己的集群各台电脑投票选举出来的。 事务:一通操作,要么同时成立,要么都不成立。 举例:Jack 和 Rose Rose 给 Jack(小李子) 转钱 Rose -100 J…

六:java 基础知识(6)-- Maven项目管理

目录 1. 引言 1.1 什么是 Maven 1.2 Maven 的优势 2. Maven 基础 2.1 Maven 的基本概念 2.2 Maven 的工作原理 2.3 Maven 的安装与配置 3. Maven 项目结构 3.1 Maven 项目的标准目录结构 3.2 POM 文件(pom.xml)概述 3.3 POM 文件的基本配置 4…

Centrifuge 5425R - 微量离心机技术数据详情——艾本德

离心机,作为实验室中的关键设备,扮演着分离、浓缩和纯化样品的重要角色。而在众多离心机型号中,Centrifuge 5425R 以其出色的性能和多功能性,成为了众多科研人员的首选。下面,我们就来详细了解一下这款微量离心机的技术…

【06】A-Maven项目SVN设置忽略文件

做Web项目开发时,运用的是Maven管理工具对项目进行管理,在项目构建的过程中自动生成了很多不需要SVN进行管理的文件,SVN在对源码进行版本管理时,需要将其忽略,本文给出了具体解决方案。 SVN设置忽略Maven项目中自动生成…

TDengine 签约蘑菇物联,改造通用设备工业互联网平台

在当前工业互联网迅猛发展的背景下,企业面临着日益增长的数据处理需求和智能化转型的挑战。通用工业设备的高能耗问题愈发突出,尤其是由这些设备组成的公辅能源车间,亟需更高效的解决方案来提升设备运行效率,降低能源消耗。为此&a…

革新汽车装配产线:MR30分布式IO模块引领智能制造新时代

在日新月异的汽车制造行业中,每一分每一秒的效率提升都意味着成本的降低与市场竞争力的增强。随着工业4.0时代的到来,智能化、自动化已成为汽车产线升级转型的关键词。在这场技术革命的浪潮中,MR30分布式IO模块以其高效、灵活、可靠的特点&am…

Qt第三课 ----------容器类控件

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

CodeQL学习笔记(4)-CodeQL for Java(程序元素)

最近在学习CodeQL,对于CodeQL就不介绍了,目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记,根据个人知识库笔记修改整理而来的,分享出来共同学习。个人觉得QL的语法比较反人类,至少与目前主流的这些OOP语言相比&…

动态规划28:376. 摆动序列

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:376.…

【zlm】h264 vp9 尝试研究

目录 编译与使用libvpx 打包lib 解决方案一 libvpx直接引用 IVF格式 编译libvpx windows下编译libvpx 参考文章 编译与使用libvpx 我们用最新的: x86_64-win64-vs16 最简单的视频编码器:编译(libx264,libx265&#xff…

顺序表专题

目录 0. 什么是数据结构? 0. 为什么需要数据结构? 1.顺序表的概念及结构 2.顺序表分类: 3.动态顺序表的实现 4. 顺序表的应用 5. 顺序表的问题及思考 0. 什么是数据结构? 数据结构是由“数据”和“结构”两词结合而来 什…

关于使用svgIcon 菜单折叠 显示文字情况

使用的工具&#xff1a;vue2&#xff0c;ant design vue 问题&#xff1a; **解决&#xff1a;在<svg-icon> 外面包一层 <a-icon> ** 使用: 在 main.js 中&#xff1a;

【JAVA毕业设计】基于Vue和SpringBoot的师生健康管理系统

博主说明&#xff1a;本文项目编号 T 052 &#xff0c;文末自助获取源码 \color{red}{T052&#xff0c;文末自助获取源码} T052&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

双向链表专题

双向链表 1. 双向链表的定义和结构2. 双向链表的实现2.1 结构声明2.2 双向链表的初始化2.3 双向链表的打印2.4 尾插2.5 头插2.6 在指定位置之前插入2.7 在指定位置之后插入数据2.8 尾删2.9 头删2.10 删除指定位置的节点2.11 查找2.12 链表的销毁 3. 双向链表的细节 &#x1f52…

发票真伪查验方式-python数电票批量查验接口、发票ocr文字识别提取

在当今的商业环境中&#xff0c;确保交易的安全性和透明度是每个企业追求的目标。随着电子商务的迅猛发展&#xff0c;发票管理成为了企业财务管理中不可或缺的一环。面对海量的电子发票&#xff0c;企业财务也无需惊慌&#xff0c;翔云发票查验API接口&#xff0c;可以为企业提…

html+js+css实现拖拽式便签留言

前些日子在网上冲浪时&#xff0c;看到一个便签式留言墙&#xff0c;让人耳目一新。心想这个看着不错&#xff0c;额想要。于是便开始搜寻是否有相应开源插件&#xff0c;想将其引入自己的博客中。但是搜寻了一圈&#xff0c;都没有符合预期的,要么功能不符合。有的功能符合&am…

初识网络编程TCP/IP

目录 前言相关名词解释应用层协议——HTTP传输层协议socketTCP帧头格式三次握手、四次挥手 UDPTCP的socket实现 参考博文 前言 刚碰到网络编程&#xff0c;会出现一堆协议、概念、这层次那技术的&#xff0c;头都大了&#xff0c;还是得总结总结…… 相关名词解释 ✨✨网络…

Vue2进阶之Vue3高级用法

Vue3高级用法 响应式Vue2&#xff1a;Object.definePropertyObject.definePropertythis.$set设置响应式 Vue3&#xff1a;Proxy composition APIVue2 option API和Vue3 compositionAPIreactive和shallowReactivereadonly效果toRefs效果 生命周期main.jsindex.htmlLifeCycle.vue…