深入了解Java Duration类,对时间的精细操作
阅读建议
嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
- 本篇文章大概6000多字,预计阅读时间长需要5分钟。
- 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
- 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。
注意
本文编写的单元测试是基于java11,具体的版本号是:11.0.19
Duration
Duration 是 Java 中表示时间段的类,用于计算两个时间点之间的间隔。它包含秒(seconds)和纳秒(nanos)两个部分,可以表示毫秒及更小的时间单位。与 Java 中的其他时间类不同,Duration 不包含毫秒这个属性。
@Test
public void test(){Duration duration=Duration.of(60, ChronoUnit.SECONDS);LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 13, 1, 1);LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间,加上指定时间段后的日期时间System.out.println(plus);//输出结果:2023-01-01T13:02:01
}
与Period类相比,Duration类和Period类都用于表示时间段,但它们在表示的时间单位和使用方式上有所不同。Period类主要用于表示年、月、日等较大的时间单位,而Duration类主要用于表示更小的时间单位,例如毫秒、纳秒等。此外,Period类提供了一些方法来获取时间段中的年、月、日等信息,而Duration类则提供了更多的方法来进行时间计算和操作。在实际使用过程中,Duration类和Period类都可以用于表示天的时间段,其他的不行,会抛出异常。
@Test
public void test2(){Duration duration=Duration.of(1,ChronoUnit.DAYS);Period period = Period.ofDays(1);System.out.println(period.getDays() == duration.toDays());
}
核心方法
Duration的核心方法包括:
Duration#of(...)
- Duration#of(long duration):这个方法用于创建一个表示给定持续时间的Duration对象,单位为纳秒。持续时间可以是从零到Long.MAX_VALUE之间的任何值。
- Duration.of(long amount, TemporalUnit unit) 用于创建表示特定时间单位的持续时间对象。该方法接受两个参数:amount:表示持续时间的长整型数值。unit:表示时间单位的 TemporalUnit 枚举类型或其子类。
- Duration#ofDays(long days):这个方法用于创建一个表示给定天数的Duration对象。
- Duration#ofHours(long hours):这个方法用于创建一个表示给定小时数的Duration对象。
- Duration#ofMinutes(long minutes):这个方法用于创建一个表示给定分钟数的Duration对象。
- Duration#ofSeconds(long seconds):这个方法用于创建一个表示给定秒数的Duration对象。
- Duration#ofMillis(long millis):这个方法用于创建一个表示给定毫秒数的Duration对象。
- Duration#ofNanos(long nanos):这个方法用于创建一个表示给定纳秒数的Duration对象。
@Test
public void test2() {Duration duration = Duration.of(1, ChronoUnit.DAYS);duration = Duration.ofDays(1);duration = Duration.ofHours(24);duration = Duration.ofMinutes(60);duration = Duration.ofSeconds(60);duration = Duration.ofMillis(1000);LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 13, 1, 1);LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间加上指定时间段后的日期时间System.out.println(plus);//输出结果:2023-01-01T13:01:02
}
Duration#between(...)
Duration.between(LocalDateTime start, LocalDateTime end)用于计算两个 LocalDateTime 对象之间的持续时间。该方法接受两个参数:start:表示起始时间的 LocalDateTime 对象。end:表示结束时间的 LocalDateTime 对象,返回值是Duration对象;
@Test
public void test3() {LocalDateTime localDateTime1 = LocalDateTime.of(2023, 1, 1, 13, 1, 1);LocalDateTime localDateTime2 = LocalDateTime.of(2023, 1, 1, 15, 1, 1);Duration duration = Duration.between(localDateTime1, localDateTime2);long seconds = duration.getSeconds();System.out.println(seconds);//输出结果:7200
}
Duration#get(...)
- Duration#get(...): 此方法返回在给定单位中的持续时间。它接受一个 java.time.temporal.TemporalUnit 参数,并返回该单位的数量。例如,如果你使用 java.time.temporal.ChronoUnit.SECONDS,此方法将返回持续时间中的秒数。
- Duration#getUnits(...): 此方法返回此持续时间包含的单位数。这通常与 get() 方法一起使用,以确定持续时间的长度,但不具体到秒或纳秒。例如,如果你有一个持续时间为2天、3小时、4分钟和5秒,那么 getUnits() 将返回一个包含这些单位的 long[] 数组。
- Duration#getSeconds(...): 此方法返回此持续时间中的秒数部分。需要注意的是,这与 get(java.time.temporal.ChronoUnit.SECONDS) 方法略有不同,后者将考虑任何溢出到分钟、小时或天数的秒数。
- Duration#getNano(...): 此方法返回此持续时间中的纳秒数部分。与秒一样,这不会考虑任何溢出到更高单位的纳秒数。
@Test
public void test4() {Duration duration = Duration.ofHours(2);List<TemporalUnit> units = duration.getUnits();System.out.println(units.toString());//输出结果:[Seconds, Nanos]long seconds = duration.get(ChronoUnit.SECONDS);System.out.println(seconds);//输出结果:7200long seconds1 = duration.getSeconds();System.out.println(seconds1);//输出结果:7200duration = Duration.ofNanos(10000);int nano = duration.getNano();System.out.println(nano);//输出结果:10000
}
Duration#plus(...)
- Duration#plus(...)用于将当前Duration对象与另一个Duration对象相加,返回一个新的Duration对象,表示两个时间段的总和。
- Duration#plusDays(...)用于将当前Duration对象与指定的天数相加,返回一个新的Duration对象,表示增加天数后的时间段。
- Duration#plusHours(...)用于将当前Duration对象与指定的小时数相加,返回一个新的Duration对象,表示增加小时数后的时间段。
- Duration#plusMinutes(...)用于将当前Duration对象与指定的分钟数相加,返回一个新的Duration对象,表示增加分钟数后的时间段。
- Duration#plusSeconds(...)用于将当前Duration对象与指定的秒数相加,返回一个新的Duration对象,表示增加秒数后的时间段。
- Duration#plusMillis(...)用于将当前Duration对象与指定的毫秒数相加,返回一个新的Duration对象,表示增加毫秒数后的时间段。
- Duration#plusNanos(...)用于将当前Duration对象与指定的纳秒数相加,返回一个新的Duration对象,表示增加纳秒数后的时间段。
@Test
public void test5() {LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 15, 1, 1);Duration duration = Duration.ofHours(2);//定义一个2小时的时间段duration=duration.plus(60,ChronoUnit.MINUTES);//当前时间段加上60分钟duration=duration.plusDays(1);//当前时间段加上1天duration=duration.plusHours(1);//当前时间段加上1小时duration=duration.plusMinutes(60);//当前时间段加上60分钟duration=duration.plusSeconds(60);//当前时间段加上60秒LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间,加上当前的时间段后的日期时间System.out.println(plus);//输出结果:2023-01-02T20:02:01
}
Duration#minus(...)
- Duration#minus(...): 用于从一个Duration对象中减去另一个Duration对象。它返回一个新的Duration对象,表示当前Duration对象与减去的那一个之间的差值。
- Duration#minusDays(...): 用于从一个Duration对象中减去一定数量的天数。它返回一个新的Duration对象,表示当前Duration对象减去指定天数后的结果。
- Duration#minusHours(...): 用于从一个Duration对象中减去一定数量的小时数。它返回一个新的Duration对象,表示当前Duration对象减去指定小时数后的结果。
- Duration#minusMinutes(...): 用于从一个Duration对象中减去一定数量的分钟数。它返回一个新的Duration对象,表示当前Duration对象减去指定分钟数后的结果。
- Duration#minusSeconds(...): 用于从一个Duration对象中减去一定数量的秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定秒数后的结果。
- Duration#minusMillis(...): 用于从一个Duration对象中减去一定数量的毫秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定毫秒数后的结果。
- Duration#minusNanos(...): 用于从一个Duration对象中减去一定数量的纳秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定纳秒数后的结果。
@Test
public void test6() {LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 10, 15, 1, 1);Duration duration = Duration.ofHours(2);//定义一个2小时的时间段duration = duration.minus(60, ChronoUnit.MINUTES);//当前时间段减去60分钟duration = duration.minusDays(1);//当前时间段减去1天duration = duration.minusHours(1);//当前时间段减去1小时duration = duration.minusMinutes(60);//当前时间段减去60分钟duration = duration.minusSeconds(60);//当前时间段减去60秒LocalDateTime minus = localDateTime.minus(duration);//计算当前日期时间,减去当前的时间段后的日期时间System.out.println(minus);//输出结果:2023-01-11T16:02:01
}
Duration#toDays()
- Duration#toDays(): 将Duration对象转换为天数。它返回一个整数值,表示时间段中包含的天数。
- Duration#toHours(): 将Duration对象转换为小时数。它返回一个整数值,表示时间段中包含的小时数。
- Duration#toMinutes(): 将Duration对象转换为分钟数。它返回一个整数值,表示时间段中包含的分钟数。
- Duration#toSeconds(): 将Duration对象转换为秒数。它返回一个整数值,表示时间段中包含的秒数。
- Duration#toMillis(): 将Duration对象转换为毫秒数。它返回一个整数值,表示时间段中包含的毫秒数。
- Duration#toNanos(): 将Duration对象转换为纳秒数。它返回一个整数值,表示时间段中包含的纳秒数。
@Test
public void test7() {Duration duration = Duration.ofDays(1);//定义一个24小时的时间段long days = duration.toDays();//结果:1long hours = duration.toHours();//结果:24long minutes = duration.toMinutes();//结果:1440long seconds = duration.toSeconds();//结果:86400
}
上一篇:深入了解Java Period类,对时间段的精确控制-CSDN博客
相关文章:

深入了解Java Duration类,对时间的精细操作
阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概6000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…...

Python:核心知识点整理大全5-笔记
目录 2. 使用方法pop()删除元素 3. 弹出列表中任何位置处的元素 4. 根据值删除元素 3 章 列表简介 3.3 组织列表 3.3.1 使用方法 sort()对列表进行永久性排序 3.3.2 使用函数 sorted()对列表进行临时排序 3.3.3 倒着打印列表 3.3.4 确定列表的长度 3.5 小结 2. 使用方…...

预训练(pre-learning)、微调(fine-tuning)、迁移学习(transfer learning)
预训练(pre-learning) 搭建一个网络模型来完成一个特定的图像分类的任务。首先,你需要随机初始化参数,然后开始训练网络,不断调整参数,直到网络的损失越来越小。在训练的过程中,一开始初始化的…...

王道数据结构课后代码题 p149 第8—— 12(c语言代码实现)
目录 8.假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。 9.设树B是一棵采用链式结构存储的二叉树,编写一个把树 B中所有结点的左、右子树进行交换的函数。 10.假设二叉树采用二叉链存储结构存储…...

Nginx服务优化以及防盗链
1. 隐藏版本号 以在 CentOS 中使用命令 curl -I http://192.168.66.10 显示响应报文首部信息。 查看版本号 curl -I http://192.168.66.10 1. 修改配置文件 vim /usr/local/nginx/conf/nginx.conf http {include mime.types;default_type application/octet-stream;…...

20231210 随机矩阵和M矩阵
1. 非负矩阵:矩阵元素均非负 定义 7.1.1 设 A ( a i j ) ∈ R m n \boldsymbol{A}\left(a_{i j}\right) \in \mathbb{R}^{m \times n} A(aij)∈Rmn, 如果 a i j ⩾ 0 , i 1 , ⋯ , m ; j 1 , ⋯ , n , a_{i j} \geqslant 0, \quad i1, \cdots, m ; j1, \cd…...

Linux(centos)学习笔记(初学)
[rootlocalhost~]#:[用户名主机名 当前所在目录]#超级管理员标识 $普通用户的标识 Ctrlshift放大终端字体 Ctrl缩小终端字体 Tab可以补全命令 Ctrlshiftc/V复制粘贴 / :根目录,Linux系统起点 ls: #list列出目录的内容,通常用户查看…...

ECharts标题字体大小自适应变化
我们在做自适应Echarts的时候,字体大小在配置项里是如下配置的, title 标题组件,包含主标题和副标题。 以下是常用的对标题的设置: title:{//设置图表的标题text:"主标题",link:"baidu.com", //设置标题超链接target:"self",...

解决使用pnpm安装时Sharp模块报错的方法
在使用pnpm进行项目依赖安装的过程中,有时候会遇到Sharp模块报错的情况。Sharp是一个用于处理图像的Node.js模块,但它的安装可能会因为各种原因而失败,导致项目无法正常启动。本文将介绍这个问题的方法。 问题描述 解决方法 在命令行分别输…...

Redis 数据的持久化 RDB、AOF、RDB + AOF、No persistence 各自优缺点
文章目录 一、RDB (Redis Database)1.1 RDB 优势1.2 RDB 缺点1.3 RDB 如何工作1.4 RDB配置1.5 开启/关闭,RDB快照策略,save指令1.6 持久化硬盘文件,dbfilename指令1.7 持久化硬盘文件的存储地址,dir指令 二、AOF (Append Only Fil…...

回味童年经典游戏的项目
目录 1.超级玛丽2.坦克大战3.吃豆人游戏4.贪吃蛇游戏 1.超级玛丽 项目地址:超级马里奥游戏源码 在线试玩网址在资源描述中 在线试玩:http://martindrapeau.github.io/backbone-game-engine/super-mario-bros/index.html 主要语言:JavaScript…...

Electron[5] 渲染进程和主进程
1 进程 Electron里头的进程分为渲染进程和主进程。简单理解: main.js就是主进程每个页面就是渲染进程一个Electron应用仅有一个主进程,可以有多个渲染进程 上面的这些概念很重要,不展开细讲。 2 进程职责 主进程是用来实现应用的基础功能…...

基于Java SSM框架实现大学生校园兼职系统项目【项目源码+论文说明】
基于java的SSM框架实现大学生兼职系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,大学生校园兼职系统当然也不能排除在外。大学生校园兼职系统是以实际运用为开…...
Codeforces Round 913 (Div. 3) A~E
目录 A. Rook 问题分析: B. YetnotherrokenKeoard 问题分析: C. Removal of Unattractive Pairs 问题分析: D. Jumping Through Segments 问题分析: E. Good Triples 问题分析: A. Rook 问题分析: 给一个棋子将其同行同列的位置输出 #include<bits/s…...

反序列化 [网鼎杯 2020 朱雀组]phpweb 1
打开题目 我们发现这个页面一直在不断的刷新 我们bp抓包一下看看 我们发现index.php用post方式传了两个参数上去,func和p 我们需要猜测func和p两个参数之间的关系,可以用php函数MD5测一下看看 我们在响应处得到了一串密文,md5解密一下看看 发…...

Java 何时会触发一个类的初始化
Java 何时会触发一个类的初始化? 使用new关键字创建对象访问类的静态成员变量 或 对类的静态成员变量进行赋值调用类的静态方法反射调用类时,如 Class.forName()初始化子类时,会先初始化其父类(如果父类还没有进行过初始化的话&a…...

我的记事本
url uniform resource locator. 统一资源定位符 请求状态码 1XX:信息响应 2XX:成功响应 3XX:重定向消息 4XX:客户端错误响应 5XX:服务器端错误响应 IP地址分类 本机回环IP地址:127.0.0.1 ~ 127.255.255.254 局域网IP(私网IP) 192.168.0.0 &am…...

GO设计模式——4、单例模式(创建型)
目录 单例模式(Singleton Pattern) 优缺点 使用场景 饿汉式和懒汉式单例模式 单例模式(Singleton Pattern) 单例模式(Singleton Pattern)是一个类只允许创建一个对象(或者实例ÿ…...

我对迁移学习的一点理解——领域适应(系列3)
文章目录 1. 领域适应(Domain Adaptation)的基本概念2.领域适应(Domain Adaptation)的目标3.领域适应(Domain Adaptation)的实现方法4.领域适应(Domain Adaptation)的可以解决的问题…...

【openssl】RSA 生成公钥私钥 |通过私钥获取公钥
通过博客:Window系统如何编译openssl 编译出openssl.exe(位于apps文件夹下)。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明!!! 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 …...

MongoDB的删除文档、查询文档语句
本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库,它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…...

Rust编程语言入门教程(三)-trait
文章目录 Rust编程语言入门教程(三)-trait什么是 trait?trait使用举例 Rust编程语言入门教程(三)-trait 什么是 trait? trait 是 Rust 中的接口,它定义了类型使用这个接口的行为。你可以类比到…...

LeetCode-1566. 重复至少 K 次且长度为 M 的模式【数组 枚举】
LeetCode-1566. 重复至少 K 次且长度为 M 的模式【数组 枚举】 题目描述:解题思路一:题意就是找出长度为m且连续重复k次的子数组。解题思路就是暴力枚举加剪枝。解题思路二:思路差不多解题思路三:0 题目描述: 给你一个…...

QT5.4.1无法打开文件
问题描述:起初是在QT代码中运行打开文件代码: QString gFilename QFileDialog::getOpenFileName(this,"open File",path,"*", nullptr,QFileDialog::DontUseNativeDialog);时,出现了堵塞情况,经过多次实验一…...

【1day】金和OA某接口存在未授权访问漏洞
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

使用Rust 构建C 组件
协议解析,这不就很快了,而且原生的标准库红黑树和avl 树支持,异步tokio 这些库,编写应用组件就很快了 rust 标准库不支持 unix 的消息队列,但是支持 shm 和 uds,后者从多方面考虑都比,消息队列更…...

AI:大模型技术
Prompt Prompt(提示)是一种在人工智能领域,特别是在自然语言处理和聊天机器人中常用的技术。它是一种输入,用于激发人工智能模型生成相应的输出。在聊天机器人中,用户输入的问题或请求就是提示,而聊天机器…...

揭开WPF里面XAML可以通过http引入命名空间的神秘面纱
前言 做WPF开发这么久,其实一直对头部引入命名空间有些疑问,为啥官方提供的库通过xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"引入,而我自己开发的就只能通过 xmlns:local="clr-namespace:Darren.Wpf.MainModule.Views"来引入…...

什么是高防IP,高防IP该如何选择。
高防IP,指的是高防御能力的IP地址。在互联网的世界里,网络安全问题成为一个重要的话题。作为一个用户,你是否曾遇到过被黑客攻击造成的网站瘫痪、信息泄露等问题?如果你是一个企业,你是否考虑过自己公司的网站和业务的…...

Linux 进程
文章目录 进程定义进程的描述查看进程方法进程状态进程优先级进程相关概念补充 进程定义 大多数的说法:进程是计算机中正在运行的程序的实例。它是操作系统对程序的一种抽象,用于管理和调度程序的执行。 个人理解: 从OS(操作系统)开始说起,…...