日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

8年了,这几个时间API你用过吗?

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8年了,这几个时间API你用过吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

相信Java 8中的LocalDate和LocalDateTime大家都非常熟悉了,這些時間API用起來非常語義化,并且能夠保證線程的安全性。今天介紹另外幾個可能你不常用的時間API以及它們的使用場景,或許能夠幫助你更好地進行開發(fā)。

Instant

最近我使用java.time.Instant比較多,因為計算JWT的過期時間和發(fā)行時間都用的是它。有人會問為什么不使用LocalDateTime呢?其實我也比較納悶。經(jīng)過一番查詢才明白了為什么要使用Instant。

時間是一條向前不斷延伸的時間線。我們定義過期時間的時候肯定是一個瞬時時間點,而Instant正好可以用來表示時間線上的一個時間戳,常用來記錄事件時間戳。

時間戳示意圖

Instant的范圍需要存儲一個超過long類型極限的數(shù)字,因此它被設(shè)計為兩個部分:

  • seconds?從計算機元年(1970-01-01T00:00:00Z)開始的秒數(shù),可能是負數(shù)哦。

  • nanos?納秒數(shù),用來修正時間以保證準確性,始終是正數(shù),而且小于999,999,999。

常用API的使用

如果你使用Instant.now()獲取當前時間戳,采用的是UTC時間,并非北京時間。所以需要加上時區(qū):

Instant?issuedAt?=?Clock.system(ZoneId.of("Asia/Shanghai")).instant();

TemporalAccessor的實現(xiàn)類,比如常用的LocalDate、LocalDateTime都可以轉(zhuǎn)換為Instant,例如:

Instant?current?=?Instant.from(LocalDateTime.now());Instant?instant?=?LocalDateTime.now().toInstant(ZoneOffset.ofHours(8));

如果在計算機元年以前,需要用負值表示:

Instant?instantBefore1970?=?Instant.ofEpochSecond(-13434234,?343434);

還有其它一些API就不一一介紹了,請務(wù)必記住,它通常用來記錄事件發(fā)生的瞬時時刻。

Duration

這是一個持續(xù)時間,通常表示持續(xù)了多少時間。它記錄了一個時間量,可以來自一個開始時間和結(jié)束時間,也可以來自一些時間計量單位。它同樣用秒數(shù)納秒來存儲時間量,秒數(shù)同樣可以是負數(shù),納秒只能是正數(shù)。

Java 8 Duration

常用API的使用

比如你花了3天時間寫了個需求:

Duration?days?=?Duration.ofDays(3);

再精確點,從2022年4月2日到2022年4月5日,共3天:

Duration?duration?=?Duration.between(LocalDateTime.of(2022,?4,?2,0,0),LocalDateTime.of(2022,?4,?5,0,0));

注意這里只能使用能夠表示到秒的Temporal實現(xiàn),比如LocalDate只能表示到天,是不行的。

?

剩下的持續(xù)了多少年、多少月、多少分鐘、多少小時、多少秒就不一一演示了。

格式化

格式基于?ISO-8601?持續(xù)時間格式PnDTnHnMn.nS?,其中天數(shù)被認為是 24 小時。字符串以可選符號開頭,由 ASCII 負號或正號表示。如果為負,則整個周期都被否定。接下來是大寫或小寫的?ASCII?字母“P”。然后有四個部分,每個部分由一個數(shù)字和一個后綴組成。這些部分具有“D”、“H”、“M”和“S”的 ASCII 后綴,表示天、小時、分鐘和秒,接受大寫或小寫。后綴必須按順序出現(xiàn)。ASCII 字母“T”必須出現(xiàn)在小時、分鐘或秒部分的第一次出現(xiàn)(如果有)之前。必須存在四個部分中的至少一個,如果存在“T”,則必須在“T”之后至少有一個部分。每個部分的數(shù)字部分必須由一個或多個 ASCII 數(shù)字組成。該數(shù)字可以以 ASCII 負號或正號為前綴。天數(shù)、小時數(shù)和分鐘數(shù)必須解析為long 。秒數(shù)必須解析為帶有可選分數(shù)的long整數(shù)。小數(shù)點可以是點或逗號。小數(shù)部分可能有 0 到 9 個數(shù)字。

實力

格式含義
PT20.345S20.345秒
PT15M15分鐘
PT10H10小時
P2D2天
P2DT3H4M2天3小時4分鐘
P-6H3M減6小時加3分鐘,等于減5小時57分鐘
-P6H3M否定全部,減6小時3分鐘
-P-6H+3M加6小時減3分鐘,等于持續(xù)5小時57分鐘

Period

說到這里就不得不說一下Period,感覺它和Duration非常類似,只不過它建立在年月日上,以年、月和日為單位對時間量或時間量進行建模。非常容易理解這里就不細說了,記住它最多精確到天就夠了,它同樣是用來記錄持續(xù)時間的,只不過粒度粗了一些。

常用API

持續(xù)了2年:

Period?years?=?Period.ofYears(2); //?其它時間單位就不演示了。

這里可以使用進行初始化:

Period?weeks?=?Period.ofWeeks(3);

新冠從2019年12月持續(xù)到2022年4月

Period?covid19Period?=?Period.between(LocalDate.of(2019,12,1),LocalDate.of(2022,4,7));

格式化

基于 ISO-8601 句點格式PnYnMnD和PnW?。字符串以可選符號開頭,由 ASCII 負號或正號表示。如果為負,則整個周期都被否定。接下來是大寫或小寫的 ASCII 字母“P”。然后有四個部分,每個部分由一個數(shù)字和一個后綴組成。必須存在四個部分中的至少一個。這些部分具有“Y”、“M”、“W”和“D”的 ASCII 后綴,表示年、月、周和日,接受大寫或小寫。后綴必須按順序出現(xiàn)。每個部分的數(shù)字部分必須由 ASCII 數(shù)字組成。該數(shù)字可以以 ASCII 負號或正號為前綴。該數(shù)字必須解析為int?。前導加號/減號和其他單位的負值不是 ISO-8601 標準的一部分。此外,ISO-8601 不允許在PnYnMnD和PnW格式之間混合。任何基于周的輸入乘以 7 并視為天數(shù)。

示例:

格式含義
P2Y兩年
P3M仨月
P4W四周
P5D五天
P1Y2M3D一年倆月零3天
P1Y2M3W4D一年倆月三周零四天,Period.of(1, 2, 25),3x7+4=25
P-1Y2MPeriod.of(-1, 2, 0)
-P1Y2MPeriod.of(-1, -2, 0)
?

這個感覺用來做日歷計算比較合適一些。

如果你覺得本篇有用,請點個再看和贊、轉(zhuǎn)發(fā)哦!

往期推薦

避開10個面試大坑,接offer成功率提升至99%


知乎高贊:從源碼層,拆解OracleJDK和OpenJDK有什么區(qū)別?網(wǎng)友:不愧是大神的回答~


開源作者去世后,代碼誰來繼承?


有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號

好文章,我在看??

總結(jié)

以上是生活随笔為你收集整理的8年了,这几个时间API你用过吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。