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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java打印日期序列_Java8新特性之新日期API

發布時間:2023/12/14 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java打印日期序列_Java8新特性之新日期API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

早期的日期 API

在早期也就是 Java 8 之前,JDK 原生比較有名的有兩個類:

Date 類

Calendar 類

這兩個類相對來說用起來是比較困難的,之前我們往往是用的第三方的庫。

新日期 API 的引入

在我們業界來說,這兩個有兩個很致命的問題:

Date 類 和 Calendar 類都是線程不安全的

除非我們的實例是留在方法體內的

Calendar 類設計不太友好

比如,查第幾個月是從 0 開始計數

現在呢,Java 8 引入了一些新的 API,徹底簡化了這些操作。

圍繞這套新的 API 有許多類,我們著重介紹如下幾個:

Instant & DurationZonedDateTime & LocalDateTime

以上兩個,是處理時間的關鍵

DateTimeFormatter

把一個時間對象序列化或者反序列化成字符串

TemporalAdjusters

更像是一個 help 類,不是一個非常核心的類

所有涉及時間的操作邏輯,我們可以主要分成如下兩點:

時區的計算

時區是一個相對的概念,比如中國的時間、美國的時間是有時差的

絕對時間

從過去的某一個過去的時間點到現在總共過了多少秒或毫秒,比如 1970年1月1日 0點到現在過去了多少

我們一般以絕對時間來作為參考

我們要了解新的 API 也是從這兩點出發。

Instant 類和 Duration 類

Instant 類就代表了絕對時間的概念,它能告訴你無論是哪一個國家或者是哪一個城市,我們相比地球上過去歷史上的某個時間點到現在為止過去了多少時間。

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("現在過去了多少秒:" + now.getEpochSecond()); //現在過去了多少秒:1613704995

9 }10 }

我們可以用 Instant 的一些 get 方法可以得到絕對時間的坐標參考,比如,我們可以測量一個函數執行花費了多少時間

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 //執行一些邏輯

10 Thread.sleep(2000);11 Instant end =Instant.now();12

13 //和 Instant 掛鉤的還有一個 Duration14 //計算這個時間持續了多久

15 Duration duration =Duration.between(start, end);16 System.out.println(duration.getSeconds());17 }18 }19

20 /**

21 輸出:22 223 */

ZonedDateTime 類和 LocalDateTime 類

Instant 類代表了時間軸上的絕對時間,但是它并不是一個友好的日歷時間,只能是說當前這個時間點離格林威治時間(1970年1月1日 0點)過去了多少,但是它并不能代表著今天是星期幾或者幾幾年的幾月幾日。

那么我們怎么知道一個日歷時間呢?

這就要涉及到 ZonedDateTime 和 LocalDateTime 這兩個類,這兩個時間可以理解為相對時間。

ZonedDateTime 是帶時區的類,LocalDateTime 是不帶時區的類。

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 * 將一個絕對的時間轉換成一個與地區相關的時間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轉成的ZonedDateTime類型的UTC時間:" +zoneTime01);18

19 //方法二:20 //ZonedDateTime.ofInstant(start, ZoneId.of(ZoneId))21 //ZoneId22 //地區id

23 ZonedDateTime dtUTC = ZonedDateTime.ofInstant(start, ZoneId.of("UTC"));24 System.out.println("ZonedDateTime轉成的UTC時間:" +dtUTC);25

26 //ZoneId.of() 也不一定顯示的傳遞一個地區字符串或者 UTC 等

27 ZonedDateTime dtSH =start.atZone(ZoneId.systemDefault());28 System.out.println("systemDefault:" +dtSH);29 }30 }31

32 /**

33 輸出:34 atZone轉成的ZonedDateTime類型的UTC時間:2021-02-19T03:58:22.270337800Z[UTC]35 ZonedDateTime轉成的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 幾乎是一模一樣,唯一的區別就是 LocalDateTime 類是一個不帶時區的。

也就是說,使用 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 */

格式可以隨意設置,再例如:

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 */

也可以加上時區的偏移量

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 大寫是為了區分 "月" 和 "分"

H 大寫是為了區分 12小時制和 24小時制

小寫的 h 是12小時制

大寫的 H 是24小時制

有時候我們會看到這樣的格式:yyyy-M-d H?:m:?s

mm 與 m 等,它們的區別為 是否有前導零

H,m,s表示 非零開始,HH,mm,ss表示 從零開始

比如凌晨1點2分,HH:mm顯示為 01:02,H:m顯示為 1:2。

反序列化

我們可以使用 ZonedDateTime.parse()將一個字符串轉回一個反序列化的 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 的方法,用來調整時間,比如說,我想設置一些時間,但是可能因為某些業務邏輯,想單純的設置某些量有點困難,就可以用這個類。

可以做一些時間業務上給我們封裝好的事情

例如,我們想獲取下周五的日期時間

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 之間的關系

總結

以上是生活随笔為你收集整理的java打印日期序列_Java8新特性之新日期API的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。