1. 程式人生 > >Java 8 時間日期庫的20個使用演示樣例

Java 8 時間日期庫的20個使用演示樣例

行處理 day data- 替換 獲取當前的年月 靜態方法 2014年 習慣 function

除了lambda表達式,stream以及幾個小的改進之外,Java 8還引入了一套全新的時間日期API,在本篇教程中我們將通過幾個簡單的任務演示樣例來學習怎樣使用Java 8的這套API。Java對日期,日歷及時間的處理一直以來都飽受詬病。尤其是它決定將java.util.Date定義為可改動的以及將SimpleDateFormat實現成非線程安全的。

看來Java已經意識到須要為時間及日期功能提供更好的支持了,這對已經習慣使用Joda時間日期庫的社區而言也是件好事。

關於這個新的時間日期庫的最大的長處就在於它定義清楚了時間日期相關的一些概念,比方說,瞬時時間(Instant),持續時間(duration)。日期(date),時間(time)。時區(time-zone)以及時間段(Period)。同一時候它也借鑒了Joda庫的一些長處。比方將人和機器對時間日期的理解區分開的。

Java 8仍然延用了ISO的日歷體系。而且與它的前輩們不同。java.time包中的類是不可變且線程安全的。

新的時間及日期API位於java.time包中,以下是裏面的一些關鍵的類:

  • Instant——它代表的是時間戳
  • LocalDate——不包括詳細時間的日期。比方2014-01-14。它能夠用來存儲生日。周年紀念日,入職日期等。
  • LocalTime——它代表的是不含日期的時間
  • LocalDateTime——它包括了日期及時間。只是還是沒有偏移信息或者說時區。

  • ZonedDateTime——這是一個包括時區的完整的日期時間,偏移量是以UTC/格林威治時間為基準的。

新的庫還添加了ZoneOffset及Zoned,能夠為時區提供更好的支持。有了新的DateTimeFormatter之後日期的解析及格式化也變得煥然一新了。隨便提一句。我是在去年這個時候Java正要推出這個新功能時寫的這篇文章,所以你會發現演示樣例中的時間都還是去年的。你執行下這些樣例,它們返回的值肯定都是正確的。

Java 8是怎樣處理時間及日期的

有人問我學習一個新庫的最佳途徑是什麽?我的回答是,就是在實際項目中那樣去使用它。在一個真實的項目中會有各種各樣的需求,這會促使開發者去探索和研究這個新庫。簡言之,僅僅有任務本身才會真正促使你去探索及學習。

java 8的新的日期及時間API也是一樣。

為了學習Java 8的這個新庫。這裏我創建了20個以任務為導向的樣例。我們先從一個簡單的任務開始。比方說怎樣用Java 8的時間日期庫來表示今天,接著再進一步生成一個帶時間及時區的完整日期,然後再研究下怎樣完畢一些更實際的任務。比方說開發一個提醒類的應用,來找出距離一些特定日期比方生日,周日紀念日,下一個帳單日,下一個溢價日或者信用卡過期時間還有多少天。

演示樣例1 怎樣 在Java 8中獲取當天的日期

Java 8中有一個叫LocalDate的類,它能用來表示今天的日期。

這個類與java.util.Date略有不同,由於它僅僅包括日期,沒有時間。因此,假設你僅僅須要表示日期而不包括時間。就能夠使用它。

LocalDate today = LocalDate.now(); System.out.println("Today‘s Local date : " + today); 

Output 
Today‘s Local date : 2014-01-14

你能夠看到它創建了今天的日期卻不包括時間信息。它還將日期格式化完了再輸出出來,不像之前的Date類那樣,打印出來的數據都是未經格式化的。

演示樣例2 怎樣在Java 8中獲取當前的年月日

LocalDate類中提供了一些非常方便的方法能夠用於提取出年月日以及其他的日期屬性。使用這些方法,你能夠獲取到不論什麽你所須要的日期屬性,而不再須要使用java.util.Calendar這種類了:

LocalDate today = LocalDate.now(); 
int year = today.getYear(); 
int month = today.getMonthValue(); 
int day = today.getDayOfMonth(); 
System.out.printf("Year : %d Month : %d day : %d \t %n", year, month, day); 

Output 
Today‘s Local date : 2014-01-14 
Year : 2014 Month : 1 day : 14

能夠看到。在Java 8中獲取年月信息非常easy。僅僅需使用相應的getter方法就好了,無需記憶,非常直觀。你能夠拿它和Java中老的獲取當前年月日的寫法進行一下比較。

演示樣例3 在Java 8中怎樣獲取某個特定的日期

在第一個樣例中,我們看到通過靜態方法now()來生成當天日期是非常easy的,只是通過另一個十分實用的工廠方法LocalDate.of(),則能夠創建出隨意一個日期,它接受年月日的參數。然後返回一個等價的LocalDate實例。

關於這種方法另一個好消息就是它沒有再犯之前API中的錯。比方說,年僅僅能從1900年開始。月必須從0開始,等等。這裏的日期你寫什麽就是什麽,比方說。以下這個樣例中它代表的就是1月14日,沒有什麽隱藏邏輯。

LocalDate dateOfBirth = LocalDate.of(2010, 01, 14); 
System.out.println("Your Date of birth is : " + dateOfBirth); 

Output : Your Date of birth is : 2010-01-14

能夠看出,創建出來的日期就是我們所寫的那樣。2014年1月14日。

演示樣例4 在Java 8中怎樣檢查兩個日期是否相等

假設說起現實中實際的處理時間及日期的任務,有一個常見的就是要檢查兩個日期是否相等。你可能經常會碰到要推斷今天是不是某個特殊的日子,比方生日啊。周年紀念日啊,或者假期之類。有的時候,會給你一個日期,讓你檢查它是不是某個日子比方說假日。以下這個樣例將會幫助你在Java 8中完畢這類任務。正如你所想的那樣,LocalDate重寫了equals方法來進行日期的比較。例如以下所看到的:

LocalDate date1 = LocalDate.of(2014, 01, 14); if(date1.equals(today)){ 
    System.out.printf("Today %s and date1 %s are same date %n", today, date1); 
} 

Output 
today 2014-01-14 and date1 2014-01-14 are same date

在本例中我們比較的兩個日期是相等的。同一時候,假設在代碼中你拿到了一個格式化好的日期串,你得先將它解析成日期然後才幹比較。你能夠將這個樣例與Java之前比較日期的方式進行下比較,你會發現它真是爽多了。

演示樣例5 在Java 8中怎樣檢查反復事件,比方說生日

在Java中另一個與時間日期相關的實際任務就是檢查反復事件,比方說每月的帳單日,結婚紀念日。每月還款日或者是每年交保險費的日子。

假設你在一家電商公司工作的話。那麽肯定會有這麽一個模塊,會去給用戶發送生日祝福而且在每一個重要的假日給他們捎去問候,比方說聖誕節。感恩節,在印度則可能是萬燈節(Deepawali)。

怎樣在Java中推斷是否是某個節日或者反復事件?使用MonthDay類。這個類由月日組合,不包括年信息。也就是說你能夠用它來代表每年反復出現的一些日子。當然也有一些別的組合。比方說YearMonth類。

它和新的時間日期庫中的其他類一樣也都是不可變且線程安全的。而且它還是一個值類(value class)。我們通過一個樣例來看下怎樣使用MonthDay來檢查某個反復的日期:

LocalDate dateOfBirth = LocalDate.of(2010, 01, 14); 
MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth()); 
MonthDay currentMonthDay = MonthDay.from(today); 
if(currentMonthDay.equals(birthday)){ 
    System.out.println("Many Many happy returns of the day !!"); 
}else{ 
    System.out.println("Sorry, today is not your birthday"); 
} 

Output: Many Many happy returns of the day !!

雖然年不同,但今天就是生日的那天,所以在輸出那裏你會看到一條生日祝福。你能夠調整下系統的時間再執行下這個程序看看它能否提醒你下一個生日是什麽時候。你還能夠試著用你的下一個生日來編寫一個JUnit單元測試看看代碼能否正確執行。

演示樣例6 怎樣在Java 8中獲取當前時間

這與第一個樣例中獲取當前日期非常相似。這次我們用的是一個叫LocalTime的類。它是沒有日期的時間。與LocalDate是近親。這裏你也能夠用靜態工廠方法now()來獲取當前時間。

默認的格式是hh:mm:ss:nnn,這裏的nnn是納秒。能夠和Java 8曾經怎樣獲取當前時間做一下比較。

LocalTime time = LocalTime.now(); System.out.println("local time now : " + time);

Output 
local time now : 16:33:33.369 // in hour, minutes, seconds, nano seconds

能夠看到。當前時間是不包括日期的。由於LocalTime僅僅有時間。沒有日期。

演示樣例7 怎樣添加時間裏面的小時數

非常多時候我們須要添加小時,分或者秒來計算出將來的時間。

Java 8不僅提供了不可變且線程安全的類,它還提供了一些更方便的方法譬如plusHours()來替換原來的add()方法。順便說一下,這些方法返回的是一個新的LocalTime實例的引用,由於LocalTime是不可變的,可別忘了存儲好這個新的引用。

LocalTime time = LocalTime.now(); 
LocalTime newTime = time.plusHours(2); // adding two hours 
System.out.println("Time after 2 hours : " + newTime); 

Output : 
Time after 2 hours : 18:33:33.369

能夠看到當前時間2小時後是16:33:33.369。如今你能夠將它和Java中添加或者降低小時的老的方式進行下比較。一看便知哪種方式更好。

演示樣例8 怎樣獲取1周後的日期

這與前一個獲取2小時後的時間的樣例相似。這裏我們將學會怎樣獲取到1周後的日期。LocalDate是用來表示無時間的日期的,它有一個plus()方法能夠用來添加日,星期,或者月,ChronoUnit則用來表示這個時間單位。

由於LocalDate也是不可變的。因此不論什麽改動操作都會返回一個新的實例,因此別忘了保存起來。

LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS); 
System.out.println("Today is : " + today); 
System.out.println("Date after 1 week : " + nextWeek); 

Output: 
Today is : 2014-01-14 
Date after 1 week : 2014-01-21

能夠看到7天也就是一周後的日期是什麽。你能夠用這種方法來添加一個月,一年。一小時,一分鐘。甚至是十年。查看下Java API中的ChronoUnit類來獲取很多其他選項。

演示樣例9 一年前後的日期

這是上個樣例的續集。上例中,我們學習了怎樣使用LocalDate的plus()方法來給日期添加日,周或者月。如今我們來學習下怎樣用minus()方法來找出一年前的那天。

LocalDate previousYear = today.minus(1, ChronoUnit.YEARS); 
System.out.println("Date before 1 year : " + previousYear); 
LocalDate nextYear = today.plus(1, YEARS); 
System.out.println("Date after 1 year : " + nextYear); 

Output: 
Date before 1 year : 2013-01-14 
Date after 1 year : 2015-01-14

能夠看到如今一共同擁有兩年,一個是2013年,一個是2015年,各自是2014的前後那年。

演示樣例10 在Java 8中使用時鐘

Java 8中自帶了一個Clock類,你能夠用它來獲取某個時區下當前的瞬時時間,日期或者時間。能夠用Clock來替代System.currentTimeInMillis()與 TimeZone.getDefault()方法。

// Returns the current time based on your system clock and set to UTC. 
Clock clock = Clock.systemUTC(); 
System.out.println("Clock : " + clock); 

// Returns time based on system clock zone Clock defaultClock = 
Clock.systemDefaultZone(); 
System.out.println("Clock : " + clock); 

Output: 
Clock : SystemClock[Z] 
Clock : SystemClock[Z]

你能夠用指定的日期來和這個時鐘進行比較,比方以下這樣:

public class MyClass { 
    private Clock clock; // dependency inject ... 

    public void process(LocalDate eventDate) { 

        if(eventDate.isBefore(LocalDate.now(clock)) { 
            ... 
        } 
    } 
}

假設你須要對不同一時候區的日期進行處理的話這是相當方便的。

演示樣例11 在Java中怎樣推斷某個日期是在另一個日期的前面還是後面

這也是實際項目中常見的一個任務。你怎麽推斷某個日期是在另一個日期的前面還是後面,或者正好相等呢?在Java 8中,LocalDate類有一個isBefore()和isAfter()方法能夠用來比較兩個日期。假設調用方法的那個日期比給定的日期要早的話,isBefore()方法會返回true。

LocalDate tomorrow = LocalDate.of(2014, 1, 15); 、if(tommorow.isAfter(today)){ 
    System.out.println("Tomorrow comes after today"); 
} 
LocalDate yesterday = today.minus(1, DAYS); 
if(yesterday.isBefore(today)){ 
    System.out.println("Yesterday is day before today"); 
} 

Output: 
Tomorrow comes after today 
Yesterday is day before today

能夠看到在Java 8中進行日期比較非常easy。不須要再用像Calendar這種另一個類來完畢相似的任務了。

演示樣例12 在Java 8中處理不同的時區

Java 8不僅將日期和時間進行了分離,同一時候還有時區。如今已經有好幾組與時區相關的類了。比方ZonId代表的是某個特定的時區,而ZonedDateTime代表的是帶時區的時間。

它等同於Java 8曾經的GregorianCalendar類。

使用這個類。你能夠將本地時間轉換成另一個時區中的相應時間。比方以下這個樣例:

// Date and time with timezone in Java 8 ZoneId america = ZoneId.of("America/New_York"); 
LocalDateTime localtDateAndTime = LocalDateTime.now(); 
ZonedDateTime dateAndTimeInNewYork = ZonedDateTime.of(localtDateAndTime, america ); 
System.out.println("Current date and time in a particular timezone : " + dateAndTimeInNewYork); 

Output : 
Current date and time in a particular timezone : 2014-01-14T16:33:33.373-05:00[America/New_York]

能夠拿它跟之前將本地時間轉換成GMT時間的方式進行下比較。順便說一下,正如Java 8曾經那樣,相應時區的那個文本可別弄錯了,否則你會碰到這麽一個異常:

Exception in thread "main" java.time.zone.ZoneRulesException: Unknown time-zone ID: ASIA/Tokyo
        at java.time.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:272)
        at java.time.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:227)
        at java.time.ZoneRegion.ofId(ZoneRegion.java:120)
        at java.time.ZoneId.of(ZoneId.java:403)
        at java.time.ZoneId.of(ZoneId.java:351)

演示樣例13 怎樣表示固定的日期。比方信用卡過期時間

正如MonthDay表示的是某個反復出現的日子的。YearMonth又是另一個組合,它代表的是像信用卡還款日。定期存款到期日。options到期日這類的日期。你能夠用這個類來找出那個月有多少天,lengthOfMonth()這種方法返回的是這個YearMonth實例有多少天。這對於檢查2月究竟是28天還是29天但是非常實用的。

YearMonth currentYearMonth = YearMonth.now(); System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth()); 
YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY); 
System.out.printf("Your credit card expires on %s %n", creditCardExpiry); 

Output: 
Days in month year 2014-01: 31 
Your credit card expires on 2018-02

演示樣例14 怎樣在Java 8中檢查閏年

這並沒什麽復雜的,LocalDate類有一個isLeapYear()的方法能夠返回當前LocalDate相應的那年是否是閏年。假設你還想反復造輪子的話,能夠看下這段代碼。這是純用Java編寫的推斷某年是否是閏年的邏輯。

if(today.isLeapYear()){ 
    System.out.println("This year is Leap year"); 
}else { 
    System.out.println("2014 is not a Leap year"); 
} 

Output: 2014 is not a Leap year

你能夠多檢查幾年看看結果是否正確。最好寫一個單元測試來對正常年份和閏年進行下測試。

演示樣例15 兩個日期之間包括多少天。多少個月

另一個常見的任務就是計算兩個給定的日期之間包括多少天,多少周或者多少年。

你能夠用java.time.Period類來完畢這個功能。

在以下這個樣例中,我們將計算當前日期與將來的一個日期之前一共隔著幾個月。

LocalDate java8Release = LocalDate.of(2014, Month.MARCH, 14); 
Period periodToNextJavaRelease = 
Period.between(today, java8Release); 
System.out.println("Months left between today and Java 8 release : " + periodToNextJavaRelease.getMonths() ); 

Output: 
Months left between today and Java 8 release : 2

能夠看到,本月是1月,而Java 8的公布日期是3月,因此中間隔著2個月。

演示樣例16 帶時區偏移量的日期與時間

在Java 8裏面,你能夠用ZoneOffset類來代表某個時區。比方印度是GMT或者UTC5:30。你能夠使用它的靜態方法ZoneOffset.of()方法來獲取相應的時區。僅僅要獲取到了這個偏移量,你就能夠拿LocalDateTime和這個偏移量創建出一個OffsetDateTime。

LocalDateTime datetime = LocalDateTime.of(2014, Month.JANUARY, 14, 19, 30); 
ZoneOffset offset = ZoneOffset.of("+05:30"); 
OffsetDateTime date = OffsetDateTime.of(datetime, offset); 
System.out.println("Date and Time with timezone offset in Java : " + date); 

Output : 
Date and Time with timezone offset in Java : 2014-01-14T19:30+05:30

能夠看到如今時間日期與時區是關聯上了。另一點就是,OffSetDateTime主要是給機器來理解的。假設是給人看的。能夠使用ZoneDateTime類。

演示樣例17 在Java 8中怎樣獲取當前時間戳

假設你還記得在Java 8前是怎樣獲取當前時間戳的,那如今這簡直就是小菜一碟了。Instant類有一個靜態的工廠方法now()能夠返回當前時間戳,例如以下:

Instant timestamp = Instant.now(); 
System.out.println("What is value of this instant " + timestamp); 

Output : 
What is value of this instant 2014-01-14T08:33:33.379Z

能夠看出。當前時間戳是包括日期與時間的。與java.util.Date非常相似,其實Instant就是Java 8前的Date,你能夠使用這兩個類中的方法來在這兩個類型之間進行轉換。比方Date.from(Instant)是用來將Instant轉換成java.util.Date的,而Date.toInstant()是將Date轉換成Instant的。

演示樣例18 怎樣在Java 8中使用提前定義的格式器來對日期進行解析/格式化

在Java 8之前,時間日期的格式化但是個技術活。我們的好夥伴SimpleDateFormat並非線程安全的,而假設用作本地變量來格式化的話又顯得有些笨重。

多虧了線程本地變量,這使得它在多線程環境下也算有了用武之地。但Java維持這一狀態也有非常長一段時間了。這次它引入了一個全新的線程安全的日期與時間格式器。它還自帶了一些提前定義好的格式器。包括了經常使用的日期格式。比方說,本例 中我們就用了提前定義的BASICISODATE格式,它會將2014年2月14日格式化成20140114。

String dayAfterTommorrow = "20140116"; 
LocalDate formatted = LocalDate.parse(dayAfterTommorrow, 
DateTimeFormatter.BASIC_ISO_DATE); 
System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted); 

Output : 
Date generated from String 20140116 is 2014-01-16

你能夠看到生成的日期與指定字符串的值是匹配的。就是日期格式上略有不同。

演示樣例19 怎樣在Java中使用自己定義的格式器來解析日期

在上例中,我們使用了內建的時間日期格式器來解析日期字符串。

當然了,提前定義的格式器的確不錯但有時候你可能還是須要使用自己定義的日期格式,這個時候你就得自己去創建一個自己定義的日期格式器實例了。

以下這個樣例中的日期格式是”MMM dd yyyy”。你能夠給DateTimeFormatter的ofPattern靜態方法()傳入不論什麽的模式。它會返回一個實例,這個模式的字面量與前例中是同樣的。比方說M還是代表月。而m仍是分。無效的模式會拋出DateTimeParseException異常,但假設是邏輯上的錯誤比方說該用M的時候用成m,這樣就沒辦法了。

String goodFriday = "Apr 18 2014"; 
try { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy");     
    LocalDate holiday = LocalDate.parse(goodFriday, formatter); 
    System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday); 
} catch (DateTimeParseException ex) { 
    System.out.printf("%s is not parsable!%n", goodFriday); 
    ex.printStackTrace(); 
} 

Output : 
Successfully parsed String Apr 18 2014, date is 2014-04-18

能夠看到日期的值與傳入的字符串的確是相符的,僅僅是格式不同。

演示樣例20 怎樣在Java 8中對日期進行格式化。轉換成字符串

在上兩個樣例中。雖然我們用到了DateTimeFormatter類但我們主要是進行日期字符串的解析。

在這個樣例中我們要做的事情正好相反。這裏我們有一個LocalDateTime類的實例,我們要將它轉換成一個格式化好的日期串。

這是眼下為止Java中將日期轉換成字符串最簡單便捷的方式了。

以下這個樣例將會返回一個格式化好的字符串。與前例同樣的是,我們仍需使用指定的模式串去創建一個DateTimeFormatter類的實例,但調用的並非LocalDate類的parse方法,而是它的format()方法。這種方法會返回一個代表當前日期的字符串。相應的模式就是傳入的DateTimeFormatter實例中所定義好的。

LocalDateTime arrivalDate = LocalDateTime.now(); 
try { 
    DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a"); 
    String landing = arrivalDate.format(format); 
    System.out.printf("Arriving at : %s %n", landing); 
    } catch (DateTimeException ex) { 
    System.out.printf("%s can‘t be formatted!%n", arrivalDate); 
    ex.printStackTrace(); 
} 

Output : Arriving at : Jan 14 2014 04:33 PM

能夠看到,當前時間是用給定的”MMM dd yyyy hh:mm a”模式來表示的,它包括了三個字母表示的月份以及用AM及PM來表示的時間。

Java 8中日期與時間API的幾個關鍵點

看完了這些樣例後。我相信你已經對Java 8這套新的時間日期API有了一定的了解了。如今我們來回想下關於這個新的API的一些關鍵的要素。

  1. 它提供了javax.time.ZoneId用來處理時區。
  2. 它提供了LocalDate與LocalTime類
  3. Java 8中新的時間與日期API中的全部類都是不可變且線程安全的,這與之前的Date與Calendar API中的恰好相反。那裏面像java.util.Date以及SimpleDateFormat這些關鍵的類都不是線程安全的。
  4. 新的時間與日期API中非常重要的一點是它定義清楚了主要的時間與日期的概念,比方說。瞬時時間,持續時間。日期,時間,時區以及時間段。它們都是基於ISO日歷體系的。
  5. 每一個Java開發者都應該至少了解這套新的API中的這五個類:
    • Instant 它代表的是時間戳,比方2014-01-14T02:20:13.592Z,這能夠從java.time.Clock類中獲取,像這樣: Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
    • LocalDate 它表示的是不帶時間的日期,比方2014-01-14。它能夠用來存儲生日,周年紀念日,入職日期等。
    • LocalTime – 它表示的是不帶日期的時間
    • LocalDateTime – 它包括了時間與日期,只是沒有帶時區的偏移量
    • ZonedDateTime – 這是一個帶時區的完整時間,它依據UTC/格林威治時間來進行時區調整
  6. 這個庫的主包是java.time。裏面包括了代表日期。時間,瞬時以及持續時間的類。它有兩個子package,一個是java.time.foramt,這個是什麽用途就非常明顯了,另一個是java.time.temporal,它能從更低層面對各個字段進行訪問。
  7. 時區指的是地球上共享同一標準時間的地區。

    每一個時區都有一個唯一標識符。同一時候另一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間。比方說。東京的偏移時間就是+09:00。

  8. OffsetDateTime類實際上包括了LocalDateTime與ZoneOffset。它用來表示一個包括格林威治時間偏移量(+/-小時:分。比方+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒。納秒)。

  9. DateTimeFormatter類用於在Java中進行日期的格式化與解析。與SimpleDateFormat不同,它是不可變且線程安全的。假設須要的話,能夠賦值給一個靜態變量。DateTimeFormatter類提供了很多提前定義的格式器,你也能夠自己定義自己想要的格式。當然了,依據約定。它另一個parse()方法是用於將字符串轉換成日期的。假設轉換期間出現不論什麽錯誤,它會拋出DateTimeParseException異常。相似的,DateFormatter類也有一個用於格式化日期的format()方法。它出錯的話則會拋出DateTimeException異常。
  10. 再說一句。“MMM d yyyy”與“MMm dd yyyy”這兩個日期格式也略有不同,前者能識別出”Jan 2 2014″與”Jan 14 2014″這兩個串,而後者假設傳進來的是”Jan 2 2014″則會報錯。由於它期望月份處傳進來的是兩個字符。

    為了解決問題,在天為個位數的情況下,你得在前面補0,比方”Jan 2 2014″應該改為”Jan 02 2014″。

關於Java 8這個新的時間日期API就說到這了。這幾個簡短的演示樣例 對於理解這套新的API中的一些新增類已經足夠了。由於它是基於實際任務來解說的。因此後面再遇到Java中要對時間與日期進行處理的工作時。就不用再四處尋找了。

我們學習了怎樣創建與改動日期實例。我們還了解了純日期,日期加時間,日期加時區的差別,知道怎樣比較兩個日期。怎樣找到某天到指定日期比方說下一個生日,周年紀念日或者保險日還有多少天。我們還學習了怎樣在Java 8中用線程安全的方式對日期進行解析及格式化,而無需再使用線程本地變量或者第三方庫這種取巧的方式。

新的API能勝任不論什麽與時間日期相關的任務

Java 8 時間日期庫的20個使用演示樣例