利用Java 8中新引入的LocalDate類來計算時間間隔,本文將用一段極其簡單的代碼來示範如何計算兩個日期之間間隔的年數。 ...
Java中和日期直接相關的類有很多,平時最常用到的就是java.util package下麵的Date和Calendar,需要用到格式的時候還會用到java.text.SimpleDateFormat
首先吐槽一下,Date和Calendar實際用起來還是有一些彆扭的,剛開始用的時候不熟悉,老是分不清Date和Calendar類的具體用法和區別。
而且Calendar類的set方法來設置日期時又有一些反人類,設置月份的時候總是要腦補一下減去1,比如要設置為2018年1月6日就要設置成2018,0,6,因為在這裡一月是用0來表示的:
Calendar cal = Calendar.getInstance();
cal.set(2018, 0, 8);
具體的原因可以看這裡的回答:StackOverflow: Why is January month 0 in Java Calendar?
反正我是不太看得下去。。
前幾天有一個簡單的需求,就是根據某兩個日期來計算出年齡。上網查了一下,直接拋棄了難用的Date和Calendar類,直接用java.time.LocalDate來做。話不多說直接上代碼:
import java.time.LocalDate; public class TestLocalDate { public static void main(String[] args) { LocalDate date1 = LocalDate.of(2018, 1, 6); LocalDate date2 = LocalDate.of(1991, 1, 3); int age = date2.until(date1).getYears(); System.out.println("You're " + age + " years old."); } }
輸出結果:
You're 27 years old.
拋棄了略顯複雜令人頭大的Date和Calendar類之間的互相轉換調用,代碼讀起來也特別清晰,是不是很爽!
java.time是Java 8中新引入的一個日期時間庫,下麵的這些方法都是java.time包裡面的。
下麵來看一下這段代碼是怎麼來用簡單清爽的方式計算時間差的:
首先,LocalDate是一個immutable class(不可變類),所以和String類一樣,不需要new一個新的對象才可以使用(?)
然後是LocalDate類用於設定日期的of方法:
public static LocalDate of(int year, Month month, int dayOfMonth) public static LocalDate of(int year, int month, int dayOfMonth)
of一共有三個重載的方法,這裡舉出其中的兩個。第一個的Month類是一個枚舉類型,包含了月份的英文名稱,如JANUARY, NOVEMBER等
第二個就是再正常不過的設置年月日,好消息是這裡的month是從1開始的,也就是說再也不用手動減去1了!!!
下麵是LocalDate類用於比較日期的until方法:
public Period until(ChronoLocalDate endDateExclusive)
這個方法返回的是一個Period類型的對象。
Period代表的是形如“2年,3個月,4天”的一段時間間隔。接下來調用的getYears方法就是屬於Period類的。
最後再來看一下Period類的一些獲取時間間隔的方法:
public int getYears() public int getMonths() public int getDays()
這三個方法分別用於獲取時間間隔的年、月和日。對,就是這麼簡單。
閑來無事時看看語言的新特性,多掌握些技能總是不會錯的。