現在開始忘了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 都有哪些提示。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9MGVNpXWUV2bOdFZo5kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLzgzM2UDMyATMwEDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
看,我們發現了什麼。:D 是不是很酷?當然了,如果我們敲出today.minus也是會出現對應的方法,隻不過minus是減的意思。來看看plusDay的源碼注釋~
我們簡單看看注釋,傳回一個在此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