新的日期和時間 API
Java8 引入了一個新的日期和時間API,位于java.time包下列另。
新的日期和時間API借鑒了Joda Time庫芽腾,其作者也為同一人,但它們并不是完全一樣的页衙,做了很多改進(jìn)摊滔。
下面來說一下幾個常用的類。首先是Instant店乐,一個Instant對象表示時間軸上的一個點卜朗。Instant.now()會返回當(dāng)前的瞬時點(格林威治時間)蟀伸。Instant.MIN和Instant.MAX分別為十億年前和十億年后。
如下代碼可以計算某算法的運行時間:
Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
Duration對象表示兩個瞬時點間的時間量】殴埽可以通過不同的方法甸陌,換算成各種時間單位湘捎。
上面所說的絕對時間并不能應(yīng)用到生活中去钟沛,所以新的Java API中提供了兩種人類時間,本地日期/時間和帶時區(qū)的時間伏穆。
LocalDate是一個帶有年份拘泞、月份和天數(shù)的日期。創(chuàng)建他可以使用靜態(tài)方法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來創(chuàng)建實例。
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 表示
一個日期和時間,用法和上面類似诗鸭。上面幾種日期時間類都屬于本地時間染簇,下面來說一下帶時區(qū)的時間。 ZonedDateTime 通過設(shè)置時區(qū)的id來創(chuàng)建一個帶時區(qū)的時間强岸。
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提供了三種格式化方法來打印日期/時間:
- 預(yù)定義的標(biāo)準(zhǔn)格式
String formattered = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(beijingOlympicOpenning);
System.out.println(formattered); // 2008-08-08T20:00:00
DateTimeFormatter類提供了多種預(yù)定義的標(biāo)準(zhǔn)格式可供使用。
- 語言環(huán)境相關(guān)的格式
標(biāo)準(zhǔn)格式主要用于機器可讀的時間戳蝌箍。為了讓人能夠讀懂日期和時間青灼,你需要使用語言環(huán)境相關(guān)的格式。
Java8提供了4種風(fēng)格妓盲,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靜態(tài)方法和與遺留類(java.util.Date贷币、java.sql.Time和java.txt.DateFormat等)互相轉(zhuǎn)換的方法。
雜項改進(jìn)
Java8在String類中只添加了一個新方法亏狰,就是join,該方法實現(xiàn)了字符串的拼接偶摔,可以把它看作split方法的逆操作暇唾。
String joined = String.join(".", "www", "cnblogs", "com");
System.out.println(joined); // www.cnblogs.com
數(shù)字包裝類提供了BYTES靜態(tài)方法,以byte為單位返回長度辰斋。
所有八種包裝類都提供了靜態(tài)的hashCode方法策州。
Short、Integer宫仗、Long够挂、Float和Double這5種類型分別提供了了sum、max和min藕夫,用來在流操作中作為聚合函數(shù)使用孽糖。
集合類和接口中添加的方法:
Java8為使用流讀取文件行及訪問目錄項提供了一些簡便的方法(Files.lines和Files.list)。同時也提供了進(jìn)行Base64編碼/解碼的方法毅贮。
Java8對GUI編程(JavaFX)办悟、并發(fā)等方面也做了改進(jìn),本文沒有一一列出滩褥。