Java 8-Duration 详解
最近发现spring boot中的有些配置使用了 Duration
,于是详细的看了 Duration
这个类
Duration
是在 Java 8中加入的,主要是用来计算日期,差值之类的。
Duration
被声明final(immutable),并且线程安全。
先看下 Duration
的实例化方式,由于构造器被私有了,对外只提供了一个 ZERO
实例,主要是使用静态工厂方法来进行实例化
自定义初始化方式,这种方式主要是以一系列of…()方法为主,可以自定义时分秒。
of(long amount, TemporalUnit unit) 在 ZERO
的基础上加上一定时间,第一个参数指定数量,第二个指定单位,单位可使用 ChronoUnit
(实现了 TemporalUnit
)
from(TemporalAmount amount) 通过TemporalAmount获取一个Duration实例,也是在 ZERO
的基础上增加
- 转换字符串方式,类似于
SimpleDateFormat
的格式化日期方式
Duration
字符串类似数字有正负之分,默认正,负以’-‘开头,紧接着’P’,下面所有字母都不区分大小写:
‘D’ – 天
‘H’ – 小时
‘M’ – 分钟
‘S’ – 秒
字符’T’是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱,比如:P2DT3M5S,P3D,PT3S
PT3M2S 等于 -PT-3M-2S
通过日期获取,这种方式实现是 between(Temporal startInclusive, Temporal endExclusive) 方法,该方法获取两个时间段的Duration实例, Temporal
有多种实现,其中就有jdk1.8中添加的 LocalTime
等等
下面介绍基本的公共方法,主要是对Duration做一些基本操作:
- 时间转换为时分秒:toSeconds(),to…()等方法
- 两个Duration比较:compareTo()相等返回0,大于返回正数,小于返回负数
- 获取指定单位的数值:get(TemporalUnit unit)
- 获取Duration中所有单位:getUnits()
- 获取Duration绝对值:abs()
- 给指定Temporal添加一个Duration:addTo(Temporal temporal)
- getNano() 获取纳秒数,获取的是纳秒部分的值,而不是转换成纳秒
- getSeconds() 获取秒数,获取的是秒部分的值,而不是转换成秒
- plusSeconds(), plus…() 加法 增加时间(时分秒),返回新实例
- dividedBy(long divisor) 除法,返回一个新的Duration实例,内部转换成秒来实现
- multipliedBy(long multiplicand) 惩罚,返回一个新的Duration实例,内部同样也是转换成秒来实现
- minus…()相关方法 减法:注意是用你输入参数去减,返回的是新的Duration实例
- 四则运算都是返回的新实例,并没有对旧实例进行修改,这是需要注意的,所以千万别忽略了返回值。
- 返回一个负的Duration实例:negated() 比如 PT1.4S 返回 PT-1.4S
- isZero() 判断是否是 ZERO 实例
- withSeconds() 和 withNanos() 两个方法通过传入秒数或者纳秒数来构造一个Duration副本
最后来看下Duration实现原理,其实很简单,Duration内部维护了 seconds 和 nanos 两个内部 long 型变量用来记录实际的Duration值,上面的所有操作其实基本都是对这两个内部变量的操作。
构造Duration实例中核心方法是:
private static Duration create(long seconds, int nanoAdjustment) {if ((seconds | nanoAdjustment) == 0) {return ZERO;}return new Duration(seconds, nanoAdjustment);
}
从这里也可以看出对Duration的实例化,其实就是对内部两个变量的一个赋值操作。
最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。
Java 8-Duration 详解相关推荐
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- Java内存溢出详解之Tomcat配置
Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...
- java基础(十三)-----详解内部类——Java高级开发必须懂的
java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...
- Java类加载机制详解【java面试题】
Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...
- Java线程池详解学习:ThreadPoolExecutor
Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...
- Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...
Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...
- 关于Java的Classpath详解
关于Java的Classpath详解 Java 的新入门者对classpath往往比较困惑,为何在开发环境中能运行的东东出去就不好,或在外面运行的东东挺溜的进了开发环境就死菜. java的优点就是他是 ...
- java异常体系结构详解
java异常体系结构详解 参考文章: (1)java异常体系结构详解 (2)https://www.cnblogs.com/hainange/p/6334042.html 备忘一下.
- java异常处理机制详解
java异常处理机制详解 参考文章: (1)java异常处理机制详解 (2)https://www.cnblogs.com/vaejava/articles/6668809.html 备忘一下.
- Java内存溢出详解
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...
最新文章
- 十大Material Design开源项目
- PHP上传图片到数据库和存储到本地文件夹的方法
- 使用Try.NET创建可交互.NET文档
- 排球制作html,MAYA打造排球建模教程
- Java 连接LDAP实现验证与查询用户
- 多线程(9)-JUC集合
- java 通过id获取html代码_分享代码技巧:解决 $.(“#id“).val() 获取不到空格之后的值
- Android Launcher——ui框架,android混合开发专利
- Red Hat Enterprise Linux 8.0 安装(全网最详细版)
- 【熵系列-3】相对熵(或者 KL散度)
- smartprinter注册版_SmartPrinter下载 4.2 共享版
- 计算机推免资源(不定期更新)
- [1]技术浅谈——小刘对渗透攻击的一些见解
- linux防火墙更改端口号,Linux防火墙开放某端口号
- 【时光它会替我们记得】- 1024有奖征文
- 看最强大脑的数字华容道,尝试理解与总结
- 常见安全漏洞及整改建议
- I2C的ACK和NACK
- Linux设置开机自启
- 送福利 手把手教你快速配置腾讯云 Linux 服务器