java打印日期序列_Java8新特性之新日期API
早期的日期 API
在早期也就是 Java 8 之前,JDK 原生比較有名的有兩個類:
Date 類
Calendar 類
這兩個類相對來說用起來是比較困難的,之前我們往往是用的第三方的庫。
新日期 API 的引入
在我們業(yè)界來說,這兩個有兩個很致命的問題:
Date 類 和 Calendar 類都是線程不安全的
除非我們的實例是留在方法體內(nèi)的
Calendar 類設(shè)計不太友好
比如,查第幾個月是從 0 開始計數(shù)
現(xiàn)在呢,Java 8 引入了一些新的 API,徹底簡化了這些操作。
圍繞這套新的 API 有許多類,我們著重介紹如下幾個:
Instant & DurationZonedDateTime & LocalDateTime
以上兩個,是處理時間的關(guān)鍵
DateTimeFormatter
把一個時間對象序列化或者反序列化成字符串
TemporalAdjusters
更像是一個 help 類,不是一個非常核心的類
所有涉及時間的操作邏輯,我們可以主要分成如下兩點:
時區(qū)的計算
時區(qū)是一個相對的概念,比如中國的時間、美國的時間是有時差的
絕對時間
從過去的某一個過去的時間點到現(xiàn)在總共過了多少秒或毫秒,比如 1970年1月1日 0點到現(xiàn)在過去了多少
我們一般以絕對時間來作為參考
我們要了解新的 API 也是從這兩點出發(fā)。
Instant 類和 Duration 類
Instant 類就代表了絕對時間的概念,它能告訴你無論是哪一個國家或者是哪一個城市,我們相比地球上過去歷史上的某個時間點到現(xiàn)在為止過去了多少時間。
1 package新日期API;2
3 importjava.time.Instant;4
5 public classNowDate {6 public static voidmain(String[] args) {7 Instant now =Instant.now();8 System.out.println("現(xiàn)在過去了多少秒:" + now.getEpochSecond()); //現(xiàn)在過去了多少秒:1613704995
9 }10 }
我們可以用 Instant 的一些 get 方法可以得到絕對時間的坐標(biāo)參考,比如,我們可以測量一個函數(shù)執(zhí)行花費了多少時間
1 package新日期API;2
3 importjava.time.Duration;4 importjava.time.Instant;5
6 public classInstant {7 public static void main(String[] args) throwsThrowable {8 Instant start =Instant.now();9 //執(zhí)行一些邏輯
10 Thread.sleep(2000);11 Instant end =Instant.now();12
13 //和 Instant 掛鉤的還有一個 Duration14 //計算這個時間持續(xù)了多久
15 Duration duration =Duration.between(start, end);16 System.out.println(duration.getSeconds());17 }18 }19
20 /**
21 輸出:22 223 */
ZonedDateTime 類和 LocalDateTime 類
Instant 類代表了時間軸上的絕對時間,但是它并不是一個友好的日歷時間,只能是說當(dāng)前這個時間點離格林威治時間(1970年1月1日 0點)過去了多少,但是它并不能代表著今天是星期幾或者幾幾年的幾月幾日。
那么我們怎么知道一個日歷時間呢?
這就要涉及到 ZonedDateTime 和 LocalDateTime 這兩個類,這兩個時間可以理解為相對時間。
ZonedDateTime 是帶時區(qū)的類,LocalDateTime 是不帶時區(qū)的類。
1. ZonedDateTime 類
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6
7 public classZonedDateTime {8 public static voidmain(String[] args) {9 /**
10 * 將一個絕對的時間轉(zhuǎn)換成一個與地區(qū)相關(guān)的時間11 */
12 Instant start =Instant.now();13
14 //方法一:15 //start.atZone(ZoneId.of(ZoneId))
16 ZonedDateTime zoneTime01 = start.atZone(ZoneId.of("UTC")); //Asia/Shanghai 傳遞即得上海的時間
17 System.out.println("atZone轉(zhuǎn)成的ZonedDateTime類型的UTC時間:" +zoneTime01);18
19 //方法二:20 //ZonedDateTime.ofInstant(start, ZoneId.of(ZoneId))21 //ZoneId22 //地區(qū)id
23 ZonedDateTime dtUTC = ZonedDateTime.ofInstant(start, ZoneId.of("UTC"));24 System.out.println("ZonedDateTime轉(zhuǎn)成的UTC時間:" +dtUTC);25
26 //ZoneId.of() 也不一定顯示的傳遞一個地區(qū)字符串或者 UTC 等
27 ZonedDateTime dtSH =start.atZone(ZoneId.systemDefault());28 System.out.println("systemDefault:" +dtSH);29 }30 }31
32 /**
33 輸出:34 atZone轉(zhuǎn)成的ZonedDateTime類型的UTC時間:2021-02-19T03:58:22.270337800Z[UTC]35 ZonedDateTime轉(zhuǎn)成的UTC時間:2021-02-19T03:58:22.270337800Z[UTC]36 systemDefault:2021-02-19T11:58:22.270337800+08:00[Asia/Shanghai]37 */
2. LocalDateTime 類
和 ZonedDateTime 類的 API 幾乎是一模一樣,唯一的區(qū)別就是 LocalDateTime 類是一個不帶時區(qū)的。
也就是說,使用 LocalDateTime 這個類 ,你可以知道某年某月某日或某個時間,但是你不知道是屬于哪個國家的,一般來說,不建議使用 LocalDateTime 。
3. 獲取 ZoneId 列表
可以使用 ZoneRulesProvider.getAvailableZoneIds()獲取 ZoneId 列表
1 package新日期API;2
3 importjava.time.zone.ZoneRulesProvider;4
5 public classZoneId {6 public static voidmain(String[] args) {7 System.out.println(ZoneRulesProvider.getAvailableZoneIds());8 }9 }
DateTimeFormatter 類
用于把一個時間對象序列化或者反序列化成字符串
序列化成字符串
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");14 System.out.println(df.format(dtSH));15 }16 }17
18 /**
19 輸出:20 2021-02-19 13:48:5221 */
格式可以隨意設(shè)置,再例如:
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");14 System.out.println(df.format(dtSH));15 }16 }17
18 /**
19 輸出:20 2021/02/19 13:51:2821 */
也可以加上時區(qū)的偏移量
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter5 {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssxx");14 String dateStr =df.format(dtSH);15 System.out.println(dateStr);16 }17 }18
19 /**
20 輸出:21 2021-02-19 13:52:25+080022 */
注意:
yyyy-MM-dd HH:mm:ss 年-月-日 時:分:秒
M 大寫是為了區(qū)分 "月" 和 "分"
H 大寫是為了區(qū)分 12小時制和 24小時制
小寫的 h 是12小時制
大寫的 H 是24小時制
有時候我們會看到這樣的格式:yyyy-M-d H?:m:?s
mm 與 m 等,它們的區(qū)別為 是否有前導(dǎo)零
H,m,s表示 非零開始,HH,mm,ss表示 從零開始
比如凌晨1點2分,HH:mm顯示為 01:02,H:m顯示為 1:2。
反序列化
我們可以使用 ZonedDateTime.parse()將一個字符串轉(zhuǎn)回一個反序列化的 ZonedDateTime
1 ZonedDateTime dt =ZonedDateTime.parse(dateStr, df);2 System.out.println(dt);3
4 /**
5 輸出:6 2021-02-19T14:06:35+08:007 */
TemporalAdjusters
這個類更像是一個 help 的方法,用來調(diào)整時間,比如說,我想設(shè)置一些時間,但是可能因為某些業(yè)務(wù)邏輯,想單純的設(shè)置某些量有點困難,就可以用這個類。
可以做一些時間業(yè)務(wù)上給我們封裝好的事情
例如,我們想獲取下周五的日期時間
1 package新日期API;2
3 importjava.time.DayOfWeek;4 importjava.time.Instant;5 importjava.time.ZoneId;6 importjava.time.ZonedDateTime;7 importjava.time.temporal.TemporalAdjusters;8
9 public classTemporalAdjusters {10 public static voidmain(String[] args) {11 Instant now =Instant.now();12 ZonedDateTime dtSH = now.atZone(ZoneId.of("Asia/Shanghai"));13 ZonedDateTime nextFriday =dtSH.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));14 System.out.println(nextFriday);15 }16 }17
18 /**
19 輸出:20 2021-02-26T14:16:04.088263300+08:00[Asia/Shanghai]21 */
各種datetime 之間的關(guān)系
總結(jié)
以上是生活随笔為你收集整理的java打印日期序列_Java8新特性之新日期API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ空间迁移_【山特C3KS_连接ESX
- 下一篇: 用Python进行身份证号校验