詳解Java8 新特性之日期API
Java 8 在包java.time下包含了一組全新的時(shí)間日期API。下面的例子展示了這組新API里最重要的一些部分:
1.Clock 時(shí)鐘
Clock類(lèi)提供了訪問(wèn)當(dāng)前日期和時(shí)間的方法,Clock是時(shí)區(qū)敏感的,可以用來(lái)取代 System.currentTimeMillis() 來(lái)獲取當(dāng)前的微秒數(shù)。某一個(gè)特定的時(shí)間點(diǎn)也可以使用Instant類(lèi)來(lái)表示,Instant類(lèi)也可以用來(lái)創(chuàng)建老的java.util.Date對(duì)象。
Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
2.Timezones 時(shí)區(qū)
在新API中時(shí)區(qū)使用ZoneId來(lái)表示。時(shí)區(qū)可以很方便的使用靜態(tài)方法of來(lái)獲取到。 時(shí)區(qū)定義了到UTS時(shí)間的時(shí)間差,在Instant時(shí)間點(diǎn)對(duì)象到本地日期對(duì)象之間轉(zhuǎn)換的時(shí)候是極其重要的。
System.out.println(ZoneId.getAvailableZoneIds());
// prints all available timezone ids
ZoneId zone1 = ZoneId.of("Europe/Berlin");
ZoneId zone2 = ZoneId.of("Brazil/East");
System.out.println(zone1.getRules());
System.out.println(zone2.getRules());
// ZoneRules[currentStandardOffset=+01:00]
// ZoneRules[currentStandardOffset=-03:00]
3.LocalTime 本地時(shí)間
LocalTime 定義了一個(gè)沒(méi)有時(shí)區(qū)信息的時(shí)間,例如 晚上10點(diǎn),或者 17:30:15。下面的例子使用前面代碼創(chuàng)建的時(shí)區(qū)創(chuàng)建了兩個(gè)本地時(shí)間。之后比較時(shí)間并以小時(shí)和分鐘為單位計(jì)算兩個(gè)時(shí)間的時(shí)間差:
LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239
LocalTime 提供了多種工廠方法來(lái)簡(jiǎn)化對(duì)象的創(chuàng)建,包括解析時(shí)間字符串。
LocalTime localTime= LocalTime.of(23, 59, 59);
System.out.println(localTime); // 23:59:59
DateTimeFormatter germanFormatter =
DateTimeFormatter
.ofLocalizedTime(FormatStyle.SHORT)
.withLocale(Locale.GERMAN);
LocalTime leetTime = localTime.format(germanFormatter);
System.out.println(leetTime);
4.LocalDate 本地日期
LocalDate 表示了一個(gè)確切的日期,比如 2014-03-11。該對(duì)象值是不可變的,用起來(lái)和LocalTime基本一致。下面的例子展示了如何給Date對(duì)象加減天/月/年。另外要注意的是這些對(duì)象是不可變的,操作返回的總是一個(gè)新實(shí)例。
LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY
從字符串解析一個(gè)LocalDate類(lèi)型和解析LocalTime一樣簡(jiǎn)單:
DateTimeFormatter germanFormatter =
DateTimeFormatter
.ofLocalizedDate(FormatStyle.MEDIUM)
.withLocale(Locale.GERMAN);
LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter);
System.out.println(xmas); // 2014-12-24
5.LocalDateTime 本地日期時(shí)間
LocalDateTime 同時(shí)表示了時(shí)間和日期,相當(dāng)于前兩節(jié)內(nèi)容合并到一個(gè)對(duì)象上了。LocalDateTime和LocalTime還有LocalDate一樣,都是不可變的。LocalDateTime提供了一些能訪問(wèn)具體字段的方法。
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439
只要附加上時(shí)區(qū)信息,就可以將其轉(zhuǎn)換為一個(gè)時(shí)間點(diǎn)Instant對(duì)象,Instant時(shí)間點(diǎn)對(duì)象可以很容易的轉(zhuǎn)換為老式的java.util.Date。
Instant instant = sylvester
.atZone(ZoneId.systemDefault())
.toInstant();
Date legacyDate = Date.from(instant);
System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014
格式化LocalDateTime和格式化時(shí)間和日期一樣的,除了使用預(yù)定義好的格式外,我們也可以自己定義格式:
DateTimeFormatter formatter =
DateTimeFormatter
.ofPattern("MMM dd, yyyy - HH:mm");
LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter);
String string = formatter.format(parsed);
System.out.println(string); // Nov 03, 2014 - 07:13
和java.text.NumberFormat不一樣的是新版的DateTimeFormatter是不可變的,所以它是線程安全的。
以上所述是小編給大家介紹的Java8 新特性之日期API,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Java8新日期時(shí)間API的20個(gè)使用示例
- java8、jdk8日期轉(zhuǎn)化成字符串詳解
- Java8新特性時(shí)間日期庫(kù)DateTime API及示例詳解
- Java8 LocalDateTime極簡(jiǎn)時(shí)間日期操作小結(jié)
- Java8時(shí)間日期庫(kù)中的常用使用示例
- Java8新特性之深入解析日期和時(shí)間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 18個(gè)Java8日期處理的實(shí)踐(太有用了)
- Java8 新特性之日期時(shí)間對(duì)象及一些其他特性
- Java8 日期和時(shí)間類(lèi)的基本使用
- 為何Java8需要引入新的日期與時(shí)間庫(kù)
相關(guān)文章
使用Postman傳遞arraylist數(shù)據(jù)給springboot方式
這篇文章主要介紹了使用Postman傳遞arraylist數(shù)據(jù)給springboot方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
關(guān)于Java JDK安裝、配置環(huán)境變量的問(wèn)題
這篇文章主要介紹了Java JDK安裝、配置環(huán)境變量,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Springboot接收文件與發(fā)送文件實(shí)例教程
最近工作中遇到個(gè)需求,springboot簡(jiǎn)單的上傳文檔或者圖片,并且進(jìn)行操作,操作完后進(jìn)行保存指定路徑,下面這篇文章主要給大家介紹了關(guān)于Springboot接收文件與發(fā)送文件的相關(guān)資料,需要的朋友可以參考下2023-05-05
使用bitset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇使用bitset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
將Java程序的輸出結(jié)果寫(xiě)入文件方法實(shí)例
這篇文章主要給大家介紹了關(guān)于將Java程序的輸出結(jié)果寫(xiě)入文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
關(guān)于spring-security(記住密碼,CSRF)
文章主要介紹了Spring Security中的PersistentTokenRepository、CSRF保護(hù)機(jī)制以及如何在登錄頁(yè)面添加記住我功能,并分享了相關(guān)實(shí)現(xiàn)代碼和配置2024-11-11

