掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流
最近我使用java.time.Instant比較多,因為計算JWT的過期時間和發(fā)行時間都用的是它。有人會問為什么不使用LocalDateTime呢?其實我也比較納悶。經過一番查詢才明白了為什么要使用Instant。

創(chuàng)新互聯主要從事成都網站設計、網站建設、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務西峰,10年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
時間是一條向前不斷延伸的時間線。我們定義過期時間的時候肯定是一個瞬時時間點,而Instant正好可以用來表示時間線上的一個時間戳,常用來記錄事件時間戳。
時間戳示意圖
Instant的范圍需要存儲一個超過long類型極限的數字,因此它被設計為兩個部分:
如果你使用Instant.now()獲取當前時間戳,采用的是UTC時間,并非北京時間。所以需要加上時區(qū):
issuedAt = Clock.system(ZoneId.of("Asia/Shanghai")).instant();TemporalAccessor的實現類,比如常用的LocalDate、LocalDateTime都可以轉換為Instant,例如:
Instant current = Instant.from(LocalDateTime.now());
Instant instant = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8));
如果在計算機元年以前,需要用負值表示:
stant instantBefore1970 = Instant.ofEpochSecond(-13434234, 343434);
還有其它一些API就不一一介紹了,請務必記住,它通常用來記錄事件發(fā)生的瞬時時刻。
這是一個持續(xù)時間,通常表示持續(xù)了多少時間。它記錄了一個時間量,可以來自一個開始時間和結束時間,也可以來自一些時間計量單位。它同樣用秒數和納秒來存儲時間量,秒數同樣可以是負數,納秒只能是正數。
Java 8 Duration
比如你花了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實現,比如LocalDate只能表示到天,是不行的。
剩下的持續(xù)了多少年、多少月、多少分鐘、多少小時、多少秒就不一一演示了。
格式基于 ISO-8601 持續(xù)時間格式PnDTnHnMn.nS ,其中天數被認為是 24 小時。字符串以可選符號開頭,由 ASCII 負號或正號表示。如果為負,則整個周期都被否定。接下來是大寫或小寫的 ASCII 字母“P”。然后有四個部分,每個部分由一個數字和一個后綴組成。這些部分具有“D”、“H”、“M”和“S”的 ASCII 后綴,表示天、小時、分鐘和秒,接受大寫或小寫。后綴必須按順序出現。ASCII 字母“T”必須出現在小時、分鐘或秒部分的第一次出現(如果有)之前。必須存在四個部分中的至少一個,如果存在“T”,則必須在“T”之后至少有一個部分。每個部分的數字部分必須由一個或多個 ASCII 數字組成。該數字可以以 ASCII 負號或正號為前綴。天數、小時數和分鐘數必須解析為long 。秒數必須解析為帶有可選分數的long整數。小數點可以是點或逗號。小數部分可能有 0 到 9 個數字。
實力:
|
格式 |
含義 |
|
? |
20.345秒 |
|
? |
15分鐘 |
|
? |
10小時 |
|
? |
2天 |
|
? |
2天3小時4分鐘 |
|
? |
減6小時加3分鐘,等于減5小時57分鐘 |
|
? |
否定全部,減6小時3分鐘 |
|
? |
加6小時減3分鐘,等于持續(xù)5小時57分鐘 |
說到這里就不得不說一下Period,感覺它和Duration非常類似,只不過它建立在年月日上,以年、月和日為單位對時間量或時間量進行建模。非常容易理解這里就不細說了,記住它最多精確到天就夠了,它同樣是用來記錄持續(xù)時間的,只不過粒度粗了一些。
持續(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”。然后有四個部分,每個部分由一個數字和一個后綴組成。必須存在四個部分中的至少一個。這些部分具有“Y”、“M”、“W”和“D”的 ASCII 后綴,表示年、月、周和日,接受大寫或小寫。后綴必須按順序出現。每個部分的數字部分必須由 ASCII 數字組成。該數字可以以 ASCII 負號或正號為前綴。該數字必須解析為int 。前導加號/減號和其他單位的負值不是 ISO-8601 標準的一部分。此外,ISO-8601 不允許在PnYnMnD和PnW格式之間混合。任何基于周的輸入乘以 7 并視為天數。
示例:
|
格式 |
含義 |
|
? |
兩年 |
|
? |
仨月 |
|
? |
四周 |
|
? |
五天 |
|
? |
一年倆月零3天 |
|
? |
一年倆月三周零四天,? |
|
? |
? |
|
? |
? |
這個感覺用來做日歷計算比較合適一些。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流