高度有用的Java ChronoUnit枚举
幾年前,我發(fā)表了博客文章“ The Highly有用的Java TimeUnit Enum ”,其中介紹了JDK 5引入的TimeUnit枚舉。 JDK 8引入了一個更新的枚舉ChronoUnit ,它比TimeUnit更適合于諸如日期/時間操作等并發(fā)以外的上下文。
位于所述java.time.temporal包 ,所述ChronoUnit類實現(xiàn)TemporalUnit接口 ,接口廣泛使用的在高度期望 JDK 8導(dǎo)入日期/時間API 。 博客文章“ Java 8中日期之間的天數(shù) ”演示了如何使用此類來計算兩個Temporal實例之間的時間段 。
博客文章“ Java 9.硬編碼“永遠”的地方。 ”介紹了JDK 9的“ TimeUnit類中的兩個新方法” 。toChronoUnit()和of(ChronoUnit)這些方法支持將TimeUnit轉(zhuǎn)換為ChronoUnit以及將ChronoUnit為TimeUnit 。 并非ChronoUnit所有值都可以轉(zhuǎn)換為TimeUnit的等效值,在這種情況下,會拋出IllegalArgumentException 。
關(guān)于ChronoUnit中每個值的Javadoc注釋描述了每個值代表什么時間單位。 但是,對于ChronoUnit每個值返回什么Duration ,這對我來說很有趣。 以下代碼段會將這些Duration的toString()表示形式寫入ChronoUnit枚舉中的所有值的標(biāo)準(zhǔn)輸出。
顯示計時單位的持續(xù)時間
for (final ChronoUnit unit : ChronoUnit.values()) {final Duration duration = unit.getDuration();out.println(unit + ": " + duration + " (" + duration.getSeconds() + " seconds)"); }執(zhí)行后,以上代碼將產(chǎn)生以下輸出:
Nanos: PT0.000000001S (0 seconds) Micros: PT0.000001S (0 seconds) Millis: PT0.001S (0 seconds) Seconds: PT1S (1 seconds) Minutes: PT1M (60 seconds) Hours: PT1H (3600 seconds) HalfDays: PT12H (43200 seconds) Days: PT24H (86400 seconds) Weeks: PT168H (604800 seconds) Months: PT730H29M6S (2629746 seconds) Years: PT8765H49M12S (31556952 seconds) Decades: PT87658H12M (315569520 seconds) Centuries: PT876582H (3155695200 seconds) Millennia: PT8765820H (31556952000 seconds) Eras: PT8765820000000H (31556952000000000 seconds) Forever: PT2562047788015215H30M7.999999999S (9223372036854775807 seconds)上面顯示的每個Duration字符串表示形式上的“ PT”前綴表示根據(jù)ISO-8601標(biāo)準(zhǔn) ,該表示形式是“期間”持續(xù)時間標(biāo)記(“ P”)和“時間”指示(“ T”)。 “ S”,“ M”和“ H”分別是秒,分鐘和小時。 的值ChronoUnit代表時間單位小于秒( NANOS , MICROS ,和MILLIS )示出了“0秒”,因為它們是小于1秒,返回值是一個整體long 。
關(guān)于ChronoUnit類中定義的每個值的Javadoc注釋編寫得很好。 它們遵循我的想法,是Javadoc的“最佳實踐”:在Javadoc中放置簡潔但內(nèi)容豐富的初始句子,以顯示在生成HTML頁面的“方法摘要”部分中,并在該初始摘要之后的句子中放置其他有用的詳細信息句子。 例如, ChronoUnit.ERAS的Javadoc注釋指出:“ 代表時代概念的單位。 ISO日歷系統(tǒng)沒有紀(jì)元,因此無法在日期或日期時間中添加紀(jì)元。 人為地將時代的估計持續(xù)時間定義為1,000,000,000年。 與其他日歷系統(tǒng)一起使用時,該裝置沒有任何限制。” “方法摘要”中顯示的是加粗的句子(我加了強調(diào)),此處顯示的全部文本完整顯示在方法上方。
在ChronoUnit枚舉中,更有趣的值之一是FOREVER 。 如上面代碼清單的輸出所示, FOREVER值的Duration為“ PT2562047788015215H30M7.999999999S”,對應(yīng)于2562047788015215小時,30分鐘和7.999999999秒。 或者,正如Grzegorz Gajos所說的那樣:“ Java 永遠將其定義為9 223 372 036 854 775 807秒。 這是2.92277266×10 11年。 最好確保在超時之前安排在應(yīng)用程序中進行Java升級。”
ChronoUnit.FOREVER會有用? 其基于Javadoc的描述解釋了其存在的主要原因:“代表永遠概念的人工單位。 這主要與TemporalField一起使用,以表示無限制的字段,例如年份或時代。 人為地將時代的估計持續(xù)時間定義為Duration支持的最大持續(xù)Duration 。”
TimeUnit是使用Java的并發(fā)構(gòu)造的有用枚舉 ,并且可以在非并發(fā)的上下文中使用,只要考慮了對這些其他上下文的一些嚴(yán)格限制即可。 JDK 8引入的ChronoUnit對于這些非并發(fā)上下文來說是一個更好的枚舉,并且特別設(shè)計用于JDK 8 Date / Time API
翻譯自: https://www.javacodegeeks.com/2018/01/highly-useful-java-chronounit-enum.html
總結(jié)
以上是生活随笔為你收集整理的高度有用的Java ChronoUnit枚举的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux重装win10(linux重装
- 下一篇: dos是linux吗(dos是linux