天天看點

告别jodatime!擁抱Java8日期時間類LocalDate、LocalDateTime詳解(上)1 為什麼需要新的日期和時間庫?2 核心思想3 LocalDate、LocalTime、LocalDateTime

1 為什麼需要新的日期和時間庫?

Java開發人員的一個長期煩惱是對普通開發人員的日期和時間用例的支援不足。

例如,現有的類(例如java.util.Date和SimpleDateFormatter)是非線程安全的,進而導緻使用者潛在的并發問題,這不是一般開發人員在編寫日期處理代碼時會期望處理的問題。

一些日期和時間類還表現出相當差的API設計。例如,年份java.util.Date從1900開始,月份從1開始,天從0開始,這不是很直覺。

這些問題以及其他一些問題導緻第三方日期和時間庫(例如Joda-Time)的欣欣向榮。

為了解決這些問題并在JDK核心中提供更好的支援,針對Java SE 8設計了一個新的沒有這些問題的日期和時間API。該項目由Joda-Time(Stephen Colebourne)和Oracle的作者在JSR 310下共同上司,出現在Java SE 8軟體包中java.time。

2 核心思想

不可變值類

Java現有格式化程式的嚴重缺陷之一是它們不是線程安全的。這給開發人員帶來了負擔,使其需要以線程安全的方式使用它們并在其日常處理日期處理代碼的過程中考慮并發問題。新的API通過確定其所有核心類都是不可變的并表示定義明确的值來避免此問題。

域驅動

新的API模型與代表不同的用例類域非常精确Date和Time嚴密。這與以前的Java庫不同,後者在這方面很差。例如,java.util.Date在時間軸上表示一個時刻(一個自UNIX紀元以來的毫秒數的包裝器),但如果調用toString(),結果表明它具有時區,進而引起開發人員之間的困惑。

這種對域驅動設計的重視在清晰度和易了解性方面提供了長期利益,但是當從以前的API移植到Java SE 8時,您可能需要考慮應用程式的域日期模型。

按時間順序分隔

新的API使人們可以使用不同的月曆系統來滿足世界某些地區(例如日本或泰國)使用者的需求,而這些使用者不一定遵循ISO-8601。這樣做不會給大多數開發人員帶來額外負擔,他們隻需要使用标準的時間順序即可。

3 LocalDate、LocalTime、LocalDateTime

3.1 相比 Date 的優勢

Date 和 SimpleDateFormatter 非線程安全,而 LocalDate 和 LocalTime 和 String 一樣,是final類型 - 線程安全且不能被修改。

Date 月份從0開始,一月是0,十二月是11。LocalDate 月份和星期都改成了 enum ,不會再用錯。

Date是一個“萬能接口”,它包含日期、時間,還有毫秒數。如果你隻需要日期或時間那麼有一些資料就沒啥用。在新的Java 8中,日期和時間被明确劃分為 LocalDate 和 LocalTime,LocalDate無法包含時間,LocalTime無法包含日期。當然,LocalDateTime才能同時包含日期和時間。

Date 推算時間(比如往前推幾天/ 往後推幾天/ 計算某年是否閏年/ 推算某年某月的第一天、最後一天、第一個星期一等等)要結合Calendar要寫好多代碼,十分惡心!

LocalDate today = LocalDate.now();
//本月的第一天
LocalDate firstday = LocalDate.of(today.getYear(),today.getMonth(),1);
//本月的最後一天
LocalDate lastDay =today.with(TemporalAdjusters.lastDayOfMonth());      

兩個都是本地的,因為它們從觀察者的角度表示日期和時間,例如桌子上的月曆或牆上的時鐘。

還有一種稱為複合類

LocalDateTime

,這是一個LocalDate和LocalTime的配對。

告别jodatime!擁抱Java8日期時間類LocalDate、LocalDateTime詳解(上)1 為什麼需要新的日期和時間庫?2 核心思想3 LocalDate、LocalTime、LocalDateTime

時區将不同觀察者的上下文區分開來,在這裡放在一邊;不需要上下文時,應使用這些本地類。這些類甚至可以用于表示具有一緻時區的分布式系統上的時間。

常用 API

now()

擷取在預設的時區系統時鐘内的目前日期。該方法将查詢預設時區内的系統時鐘,以擷取目前日期。

使用該方法将防止使用測試用的備用時鐘,因為時鐘是寫死的。

告别jodatime!擁抱Java8日期時間類LocalDate、LocalDateTime詳解(上)1 為什麼需要新的日期和時間庫?2 核心思想3 LocalDate、LocalTime、LocalDateTime

友善的加減年月日,而不必親自計算!

告别jodatime!擁抱Java8日期時間類LocalDate、LocalDateTime詳解(上)1 為什麼需要新的日期和時間庫?2 核心思想3 LocalDate、LocalTime、LocalDateTime