我用Java8解決了煩人的日期計算問題

我們平時開發日期一般都是使用Date類。在使用Date計算時,一般將會將Date轉換成時間戳,即轉換成ms後進行計算,這樣做很麻煩。當然我們也可以使用第三方日期類。

其實Java8自帶的日期類就相當的強大了,基本能滿足各種計算。今天我們就來聊聊Java8裡面的日期類。

LocateDate與LocateDateTime

LocateDate獲取的是日期,精確到天。LocateDateTime則可以精確到秒。

我用Java8解決了煩人的日期計算問題

如上程式碼,執行結果為:

todayDateTime : 2021-11-02T16:13:02。638todayDate : 2021-11-02

我們需要精確日期到秒時可以使用LocalDateTime。如果只需要精確到天,就可以使用LocalDate,比如判斷兩個日期是否為同一天就可以使用LocalDate。

如果你的需求只需要獲取時間,不需要日期。可以使用LocalTime。

@Testpublic void getCurrentTime() { LocalTime localTime = LocalTime。now(); System。out。println(“localTime :” + localTime);}

執行結果為:

localTime :16:20:20。111

由此可見Java8後日期類更加豐富了,對日期類的處理也更加人性化了。

獲取日期的年月日

Java8的LocalDate裡面自帶的方法可以獲取到日期的年月日。

//獲取年、月、日資訊@Testpublic void getDetailDate() { LocalDate today = LocalDate。now(); int year = today。getYear(); int month = today。getMonthValue(); int day = today。getDayOfMonth(); Console。log(“Year : {} Month : {} day : {}”, year, month, day); //Year : 2021 Month : 10 day : 29}

如上程式碼,返回的是:

Year : 2021 Month : 10 day : 29

判斷兩個日期是否相等

我們有時會有需求:判斷兩個日期是否為同一天。比如簽到功能,每次簽到前需要判斷今天是否已經簽到。如果在Java8之前我們可能會轉換成時間戳,透過時間戳作比較。到了Java8後,我們直接可以使用equals()方法。

我用Java8解決了煩人的日期計算問題

如上程式碼,執行結果為:

today [2021-11-03] 和 date1 [2021-11-03] 是同一天

LocalDate重寫了equals方法。

@Overridepublic boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof LocalDate) { return compareTo0((LocalDate) obj) == 0; } return false;}int compareTo0(LocalDate otherDate) { int cmp = (year - otherDate。year); if (cmp == 0) { cmp = (month - otherDate。month); if (cmp == 0) { cmp = (day - otherDate。day); } } return cmp;}

從重寫的equals原始碼來看,是將兩個日期的年月日依次作比較。

計算生日

如果我們知道使用者的出生日期,我們要判斷今天是不是使用者的生日。我們就可以使用MonthDay這個類。

我用Java8解決了煩人的日期計算問題

如上程式碼,透過MonthDay可以獲取到月和日,然後直接使用equals()方法即可進行判斷。

執行結果為:

生日快樂 !!

時間加減

我們經常會計算時間,比如給當前時間加兩小時,減兩小時等。

我用Java8解決了煩人的日期計算問題

上面程式碼執行結果為:

Time after 2 hours : 16:40:30。997newLocalDateTime after 2 hours : 2021-11-03T16:40:30。997

Java8的日期不僅可以加小時。秒,月,天,年等都可以加。

我用Java8解決了煩人的日期計算問題

我用Java8解決了煩人的日期計算問題

如果需要減時間,可以使用minusXXX()方法。

日期大小比較

Java8可以使用isBefore和isAfter來進行日期之間的比較。

我用Java8解決了煩人的日期計算問題

上面程式碼執行結果為:

Yesterday is day before today

判斷閏年

如果需要判斷當前年是不是閏年,使用Java8的isLeapYear非常方便。

@Testpublic void isLeapYear() { LocalDate today = LocalDate。now(); if (today。isLeapYear()) { System。out。println(“今年是閏年”); } else { System。out。println(“今年不是閏年”); }}

isLeapYear的方法如下

@Overridepublic boolean isLeapYear(long prolepticYear) { return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);}

計算兩個日期之間的差

Java8可以使用Period。between可以獲取兩個日期之間相差的年月日。

我用Java8解決了煩人的日期計算問題

上面程式碼執行結果

destLocalDate【2018-05-14】到today【2021-11-03】相差了【3】年【5】月【20】天

當然,我們可能還需要計算得更精確,比如計算相差多少天,多少秒等。這時就可以使用ChronoUnit列舉。

我用Java8解決了煩人的日期計算問題

我用Java8解決了煩人的日期計算問題

ChronoUnit提供了豐富的類別,完全滿足各種需求。

今天的文章就寫到這裡了,如果對你有幫助,歡迎點贊+轉發。