新的日期和時間 API
Java8 引入了一個新的日期和時間API,位於java.time包下。
新的日期和時間API借鑑了Joda Time庫,其作者也為同一人,但它們並不是完全一樣的,做了很多改進。
下面來說一下幾個常用的類。首先是Instant,一個Instant物件表示時間軸上的一個點。Instant.now()會返回當前的瞬時點(格林威治時間)。Instant.MIN和Instant.MAX分別為十億年前和十億年後。
如下程式碼可以計算某演算法的執行時間:
Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
複製程式碼
Duration物件表示兩個瞬時點間的時間量。可以通過不同的方法,換算成各種時間單位。
上面所說的絕對時間並不能應用到生活中去,所以新的Java API中提供了兩種人類時間,本地日期/時間和帶時區的時間。
LocalDate是一個帶有年份、月份和天數的日期。建立他可以使用靜態方法now或者of。
LocalDate today = LocalDate.now();
LocalDate myBirthday = LocalDate.of(1994, 03, 15);
// use Enum
myBirthday = LocalDate.of(1994, Month.MARCH, 15);
System.out.println(today); // 2017-10-23
System.out.println(myBirthday); // 1994-03-15
複製程式碼
下面是LocalDate中的一些常用方法:
LocalTime表示一天中的某個時間,同樣可以使用now或者of來建立例項。
LocalTime rightNow = LocalTime.now();
LocalTime bedTime = LocalTime.of(2, 0);
System.out.println(rightNow); // 01:26:17.139
System.out.println(bedTime); // 02:00
複製程式碼
LocalDateTime 表示
一個日期和時間,用法和上面類似。上面幾種日期時間類都屬於本地時間,下面來說一下帶時區的時間。 ZonedDateTime 通過設定時區的id來建立一個帶時區的時間。
ZonedDateTime beijingOlympicOpenning = ZonedDateTime.of(2008, 8, 8, 20, 0, 0, 0, ZoneId.of("Asia/Shanghai"));
System.out.println(beijingOlympicOpenning); // 2008-08-08T20:00+08:00[Asia/Shanghai]
複製程式碼
更新後的API同樣加入了新的格式化類DateTimeFormatter。DateTimeFormatter提供了三種格式化方法來列印日期/時間:
- 預定義的標準格式
String formattered = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(beijingOlympicOpenning);
System.out.println(formattered); // 2008-08-08T20:00:00
複製程式碼
DateTimeFormatter類提供了多種預定義的標準格式可供使用。
- 語言環境相關的格式
標準格式主要用於機器可讀的時間戳。為了讓人能夠讀懂日期和時間,你需要使用語言環境相關的格式。
Java8提供了4種風格,SHORT、MEDIUM、LONG、FULL。
String formattered = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).format(beijingOlympicOpenning);
System.out.println(formattered); //2008年8月8日 星期五 下午08時00分00秒 CST
複製程式碼
- 自定義的格式
或者你也可以自定義日期和時間的格式。
String formattered = DateTimeFormatter.ofPattern("E yyyy-MM-dd HH:mm").format(beijingOlympicOpenning);
System.out.println(formattered); // 星期五 2008-08-08 20:00
複製程式碼
下圖中為一些常用的模式元素。
新的API提供了從字串解析出日期/時間的parse靜態方法和與遺留類(java.util.Date、java.sql.Time和java.txt.DateFormat等)互相轉換的方法。
雜項改進
Java8在String類中只新增了一個新方法,就是join,該方法實現了字串的拼接,可以把它看作split方法的逆操作。
String joined = String.join(".", "www", "cnblogs", "com");
System.out.println(joined); // www.cnblogs.com
複製程式碼
數字包裝類提供了BYTES靜態方法,以byte為單位返回長度。
所有八種包裝類都提供了靜態的hashCode方法。
Short、Integer、Long、Float和Double這5種型別分別提供了了sum、max和min,用來在流操作中作為聚合函式使用。
集合類和介面中新增的方法:
Java8為使用流讀取檔案行及訪問目錄項提供了一些簡便的方法(Files.lines和Files.list)。同時也提供了進行Base64編碼/解碼的方法。
Java8對GUI程式設計(JavaFX)、併發等方面也做了改進,本文沒有一一列出。