JAVA 8 DURATION 详解

/ dev

最近发现spring boot中的有些配置使用了Duration,于是详细的看了Duration这个类

Duration是在Java8中加入的,主要是用来计算日期,差值之类的。
Duration被声明final(immutable),并且线程安全。

先看下Duration的实例化方式,由于构造器被私有了,对外只提供了一个ZERO实例,主要是使用静态工厂方法来进行实例化

时间转换为时分秒: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实例中核心方法是:

1
2
3
4
5
6
private static Duration create(long seconds, int nanoAdjustment) {
if ((seconds | nanoAdjustment) == 0) {
return ZERO;
}
return new Duration(seconds, nanoAdjustment);
}

从这里也可以看出对Duration的实例化,其实就是对内部两个变量的一个赋值操作。

最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。