Java日期時間API系列7-----Jdk8中java.time包中的新的日期時間API類的優勢

1.不變性

新的日期/時間API中,全部的類都是不可變的,這對多線程環境有好處。html

好比:LocalDateTimejava

 

 

 

2.關注點分離

新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它爲日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不一樣的類。api

不一樣時間分解成了各個類,好比:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMonth,MonthDay,DayOfWeek等,知足各類不一樣場景使用需求。安全

 

3.清晰

在全部的類中,方法都被明肯定義用以完成相同的行爲。多線程

舉個例子,要拿到當前實例咱們可使用now()方法,在全部的類中都定義了format()和parse()方法,而不是像之前那樣專門有一個獨立的類。方法明確,清晰,統一,方便好記。函數

 

4.實用操做

(至關於不少工具方法,再也不須要咱們本身封裝了):全部新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分,等等。工具

好比:LocalDateTime,包含很是豐富的實用操做(轉換,獲取各個字段,修改字段,增長和減小等)。spa

 

 

5.TemporalAdjuster 讓你可以用更精細的方式操縱日期

再也不侷限於一次只能改變它的 一個值,而且你還可按照需求定義本身的日期轉換器。好比:將日期調整到下個週日、下個工做日,或者是本月的最後一天。.net

lastDayOfMonth 建立一個新的日期,它的值爲當月的最後一天。線程

 

6.對比Jdk7及之前的日期時間類的缺點改進

6.1 Date和Calendar的不方便使用問題

(1)new Date(2019,01,01)實際是3919年2月。由於Date的構造函數 的年份表示的始於1900年的差值。

  LocalDate建立實例:

LocalDate localDate = LocalDate.of(2019, 1, 1);

(2)month是從0開始的。

LocalDate month是從1開始的:

        LocalDate localDate = LocalDate.of(2019, 1, 1);
        System.out.println(localDate.getMonthValue());

輸出是1

(3)DAY_OF_WEEK 的取值,是從週日(1)開始的。

LocalDate week是從週一(1)開始的:

        LocalDate localDate = LocalDate.of(2019, 1, 1);
        System.out.println(localDate.getDayOfWeek());
        System.out.println(localDate.getDayOfWeek().getValue());

輸出

TUESDAY
2

 

(4)Date若是不格式化,打印出的日期可讀性差。

LocalDate的輸出,清晰。

        LocalDate localDate = LocalDate.of(2019, 1, 1);
        System.out.println(localDate.getMonthValue());
        System.out.println(localDate.toString());

輸出:

2019-01-01

(5)日期類並不提供國際化,沒有時區支持

java8的時間類都支持了時區操做。

例如:LocalDateTime

         //中國時間,輸出時不包含時區
         LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
         System.out.println(ldt);
        //意大利羅馬時間,輸出時包含時區
        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Rome"));
        System.out.println(zdt);

輸出

2019-12-20T23:17:07.914
2019-12-20T16:17:07.915+01:00[Europe/Rome]

6.2 線程安全問題

(1)Date、Calendar可變性,線程安全問題

java8中全部類都是final修飾的,每次修改都會生成新的副本。

(2)DateFormat和SimpleDateFormat線程安全問題

java8中的DateTimeFormatter也是不可變的,源碼:

 

 6.3 java8對日期api進行系統的設計,增長了許多實用方便的操做,幾乎不用再使用dateutil額外工具類。

好比,增長一天。

        LocalDate localDate = LocalDate.of(2019, 1, 1);
        LocalDate localDate2 = localDate.plusDays(1);
        System.out.println("localDate:"+localDate);
        System.out.println("localDate2:"+localDate2);

輸出:

localDate:2019-01-01
localDate2:2019-01-02

 

 

參考:https://blog.csdn.net/wangsun300/article/details/103403490

相關文章
相關標籤/搜索