java 初始化duration_Java 8-Duration 详解
最近發(fā)現(xiàn)spring boot中的有些配置使用了 Duration ,于是詳細(xì)的看了 Duration 這個(gè)類
Duration 是在 Java 8中加入的,主要是用來計(jì)算日期,差值之類的。
Duration 被聲明final(immutable),并且線程安全。
先看下 Duration 的實(shí)例化方式,由于構(gòu)造器被私有了,對外只提供了一個(gè) ZERO 實(shí)例,主要是使用靜態(tài)工廠方法來進(jìn)行實(shí)例化
自定義初始化方式,這種方式主要是以一系列of…()方法為主,可以自定義時(shí)分秒。
of(long amount, TemporalUnit unit) 在 ZERO 的基礎(chǔ)上加上一定時(shí)間,第一個(gè)參數(shù)指定數(shù)量,第二個(gè)指定單位,單位可使用 ChronoUnit (實(shí)現(xiàn)了 TemporalUnit )
from(TemporalAmount amount) 通過TemporalAmount獲取一個(gè)Duration實(shí)例,也是在 ZERO 的基礎(chǔ)上增加
轉(zhuǎn)換字符串方式,類似于 SimpleDateFormat 的格式化日期方式
Duration 字符串類似數(shù)字有正負(fù)之分,默認(rèn)正,負(fù)以’-‘開頭,緊接著’P’,下面所有字母都不區(qū)分大小寫:
‘D’ – 天
‘H’ – 小時(shí)
‘M’ – 分鐘
‘S’ – 秒
字符’T’是緊跟在時(shí)分秒之前的,每個(gè)單位都必須由數(shù)字開始,且時(shí)分秒順序不能亂,比如:P2DT3M5S,P3D,PT3S
PT3M2S 等于 -PT-3M-2S
通過日期獲取,這種方式實(shí)現(xiàn)是 between(Temporal startInclusive, Temporal endExclusive) 方法,該方法獲取兩個(gè)時(shí)間段的Duration實(shí)例, Temporal 有多種實(shí)現(xiàn),其中就有jdk1.8中添加的 LocalTime 等等
下面介紹基本的公共方法,主要是對Duration做一些基本操作:
時(shí)間轉(zhuǎn)換為時(shí)分秒:toSeconds(),to…()等方法
兩個(gè)Duration比較:compareTo()相等返回0,大于返回正數(shù),小于返回負(fù)數(shù)
獲取指定單位的數(shù)值:get(TemporalUnit unit)
獲取Duration中所有單位:getUnits()
獲取Duration絕對值:abs()
給指定Temporal添加一個(gè)Duration:addTo(Temporal temporal)
getNano() 獲取納秒數(shù),獲取的是納秒部分的值,而不是轉(zhuǎn)換成納秒
getSeconds() 獲取秒數(shù),獲取的是秒部分的值,而不是轉(zhuǎn)換成秒
plusSeconds(), plus…() 加法 增加時(shí)間(時(shí)分秒),返回新實(shí)例
dividedBy(long divisor) 除法,返回一個(gè)新的Duration實(shí)例,內(nèi)部轉(zhuǎn)換成秒來實(shí)現(xiàn)
multipliedBy(long multiplicand) 懲罰,返回一個(gè)新的Duration實(shí)例,內(nèi)部同樣也是轉(zhuǎn)換成秒來實(shí)現(xiàn)
minus…()相關(guān)方法 減法:注意是用你輸入?yún)?shù)去減,返回的是新的Duration實(shí)例
四則運(yùn)算都是返回的新實(shí)例,并沒有對舊實(shí)例進(jìn)行修改,這是需要注意的,所以千萬別忽略了返回值。
返回一個(gè)負(fù)的Duration實(shí)例:negated() 比如 PT1.4S 返回 PT-1.4S
isZero() 判斷是否是 ZERO 實(shí)例
withSeconds() 和 withNanos() 兩個(gè)方法通過傳入秒數(shù)或者納秒數(shù)來構(gòu)造一個(gè)Duration副本
最后來看下Duration實(shí)現(xiàn)原理,其實(shí)很簡單,Duration內(nèi)部維護(hù)了 seconds 和 nanos 兩個(gè)內(nèi)部 long 型變量用來記錄實(shí)際的Duration值,上面的所有操作其實(shí)基本都是對這兩個(gè)內(nèi)部變量的操作。
構(gòu)造Duration實(shí)例中核心方法是:
private static Duration create(long seconds, int nanoAdjustment) {
if ((seconds | nanoAdjustment) == 0) {
return ZERO;
}
return new Duration(seconds, nanoAdjustment);
}
從這里也可以看出對Duration的實(shí)例化,其實(shí)就是對內(nèi)部兩個(gè)變量的一個(gè)賦值操作。
最后總結(jié)一下Duration最實(shí)用的一個(gè)功能其實(shí)是 between 方法,因?yàn)橛泻芏鄷r(shí)候我們需要計(jì)算兩個(gè)日期之間的天數(shù)或者小時(shí)數(shù),用這個(gè)就可以很方便的進(jìn)行操作。
總結(jié)
以上是生活随笔為你收集整理的java 初始化duration_Java 8-Duration 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springwebflux 页面_Spr
- 下一篇: mongodb的id的唯一性_探讨Mon