天天看點

jdk1.8的新特性——時間日期之LocalDate

現在開始忘了jdks1.8之前的時間日期API,開始一個新的紀元。jdk1.8的時間日期API簡直不要太好用,誰用誰知道。接下來讓我們一起探索這個新的API。:D

這些新的API位于java.time包下,我們接下來按照開發者使用的角度來探索如何使用新的API。說到日期,首先我們想到的就是如何擷取今日的日期,那讓我們看看新的API是如何做的吧。

public static void main(String[] args) {
        //擷取目前日期: 2019-08-10
        LocalDate today = LocalDate.now();
        //擷取年:2019
        int year = today.getYear();
        //擷取月:8
        int month = today.getMonthValue();
        //擷取日:10
        int day = today.getDayOfMonth();
    }
           
注意:System.out.println(today);本文都會省略。
           

當然,我們可以從today對象中擷取年,月,日。這些方法是不是很容易記憶,而且沒有1.8之前的Date擷取年份後會減去1900,擷取月份減去1。是以新版的API是一種人機互動友好的API,不用開發者過多的記憶和考慮雜七雜八的問題。再讓我們看看如何擷取昨天和明天吧,顯然昨天就是在今天的日上減去1(其實就是相當于加上-1),明天是在今天的基礎上加上1。既然是含有“加”含義的方法,那麼API的方法中肯定含有plus,敲出today.plus看看IntelliJ IDEA 都有哪些提示。

jdk1.8的新特性——時間日期之LocalDate

看,我們發現了什麼。:D 是不是很酷?當然了,如果我們敲出today.minus也是會出現對應的方法,隻不過minus是減的意思。來看看plusDay的源碼注釋~

jdk1.8的新特性——時間日期之LocalDate

我們簡單看看注釋,傳回一個在此LocalDate對象上指定加了多少天的副本,此方法将指定的數量添加到days字段上,并根據需要遞增month和year字段,以確定結果仍然有效。當超出最大/最小年份時,結果無效。舉例:2008-12-31加上一天後的結果為2009-01-01。此執行個體是不可變的,不受此方法調用的影響。參數:指定加的天數,可能是負數。傳回:基于此LocalDate對象相加天數後傳回的LocalDate,不為null。抛出異常情況:如果結果超出日期範圍抛出DateTimeException異常。

現在我們知道如何擷取與今天指定相隔多少天,多少周,多少月,多少年的方法了,那麼我們再來看看如何判斷擷取後的LocalDate對象與今天LocalDate對象的大小比較。API中提供了執行個體方法,isAfter(ChronoLocalDate other),isBefore(ChronoLocalDate other)

//擷取昨天的LocalDate對象:2019-08-09
        LocalDate yesterday = today.plusDays(-1);
        //擷取明天的LocalDate對象:2019-08-11
        LocalDate tomorrow = today.plusDays(1);

        //判斷yesterday是不是在today之後:false
        boolean flag = yesterday.isAfter(today);
        //判斷yesterday是不是在today之前:true
        boolean flag1 = yesterday.isBefore(today);
           

接下來,我們看看如何建立一個“1994-08-10”LocalDate的對象。并将其與today比較

//根據年月日建立LocalDate對象:2019-08-10
        LocalDate otherDay = LocalDate.of(2019,8,10);
        //根據文本建立LocalDate對象:1994-08-10
        LocalDate birthday = LocalDate.parse("1994-08-10");

        //判斷兩個日期是否相等:true
        boolean isSameDay = otherDay.equals(today);
        //判斷兩個日期是否相等:false
        boolean isBirthday = birthday.equals(today);
           

如果想在一個LocalDate對象上修改年、月、日而後擷取新的LocalDate對象,我們可以使用withYear(int year),withMonth(int month),withDayOfMonth(int dayOfMonth)。

//在otherDay基礎上年月日都向後移動1個機關:2020-09-11
        LocalDate anotherDay = otherDay.withYear(2020).withMonth(9).withDayOfMonth(11);

        //擷取2020年最後一天:2020-12-31
        LocalDate lastDay = anotherDay.withDayOfYear(366);

        //判斷2020年是否為閏年:true
        boolean isLeapYear = lastDay.isLeapYear();
           

可以看到withDayOfMonth和withDayOfYear的差別,前者是當月的天,範圍在0-31,後者是當年的天,範圍在1-366,閏年才會有366。

最後補充幾個實用的方法:

//根據字元串文本建立LocalDate對象(JAVA誕生日):1995-05-23
        LocalDate javaBirthday = LocalDate.parse("1995-05-23");
        //判斷 javaBirthday 是否為閏年:false
        boolean isLeapYear = lastDay.isLeapYear();

        //擷取 javaBirthday 是哪一年:1995
        int weekBasedYear = javaBirthday.get(IsoFields.WEEK_BASED_YEAR);
        //擷取 javaBirthday 是該年的第幾周:21
        int weekOfWeekBasedYear = javaBirthday.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);

        //擷取 javaBirthday 是該年的第幾季度:2
        int quarterOfYear = javaBirthday.get(IsoFields.QUARTER_OF_YEAR);
        //擷取 javaBirthday 是該季度的第幾天:53
        int daysOfQuarter = javaBirthday.get(IsoFields.DAY_OF_QUARTER);
           

如果對你有幫助,請同學們關注點贊~

下一篇:jdk1.8的新特性——時間日期之LocalTime