1. 程式人生 > >java.util.Date在jdk1.8之後有新的替代了

java.util.Date在jdk1.8之後有新的替代了

前言
為什麼我們需要一個新的日期和時間庫?
Java開發中一個長期存在的窘境是對普通開發者的date和time用例支援不足。
例如,現存的類(例如java.util.Date和SimpleDateFormatter)不是執行緒安全的,導致潛在的併發問題——不是普通開發者所期望的編寫日期處理時的程式碼。
一些日期和時間類也表現出相當差的API設計。例如,java.util.Date中的年份開始於1900年,月從1開始,而天從0開始,不是很直觀。
這些問題,還有其他問題,都導致了第三方的日期和時間庫出現,如Joda-Time。
為了解決這些問題,併為JDK核心提供更好的支援,新的日期和時間API,來解決這些問題,已被設計用於Java SE 8。
該專案已由Joda-Time的作者(Stephen Colebourne)和Oracle,JSR 310的作者共同領導,並會出現在新的Java SE 8封裝的java.time包中。

核心理念
新的API由三個核心理念驅動:

不變值的類。其中一個在Java現存formatters的嚴重弱點是,它們不是執行緒安全的。這給開發人員以執行緒安全的方式使用它們並每天都考慮併發問題而加重了負擔。新的API,確保所有的核心類是不可變的,代表明確定義的值,避免了這個問題。
領域驅動的設計。新的API非常精確地將域模組化,代表不同的日期和時間用例。這不同於以前的Java庫,以前這方面相當差。例如,java.util.Date代表時間軸 —— 一個將UNIX紀元中的毫秒進行的封裝,但如果你呼叫toString(),結果表明,它有一個時區,會對開發者造成混淆。
這種強調域驅動的設計在清晰度和可理解性上提供長遠利益,但你可能需要考慮通過從以前的API移植到Java SE 8的時候你的應用程式的域模型。
分離曆法。新的API為了支援世界的一些地區,如日本或泰國,不一定遵循ISO-8601使用者的需求,允許使用不同的日曆系統。它這樣做不會對只需要使用標準曆法工作的廣大開發者施加額外的負擔。
常用的一些類/介面
LocalDate、LocalTime、LocalDateTime、Instant、Duration、Period、TemporalAdjuster、DateTimeFormatter、ZoneId、ZonedDateTime、Chronology

LocalDate 日期不含時間
LocalTime 時間不含日期
LocalDateTime 日期時間都包含
Instant Unix時間戳
Duration/Period 時間間隔;Duration基於時間維度,而Period基於日期維度
TemporalAdjuster 日期校正器
DateTimeFormatter 格式化日期時間
ZoneId 時區標識
ZonedDateTime 帶時區的日期時間
Chronology 曆法
具體用法懶得記了,要用時再查API文件了。

與遺留的日期類互相操作
遺留的日期相關的類
java.util.Date, java.util.GregorianCalendar, and java.sql.Date/Time/Timestamp.

互操作方法
Instant 與java.util.Date 類似。在 Java 8 中,java.util.Date中新添加了兩個方法:toInstant()和from()。toInstant()方法將java.util.Date物件裝換成Instant物件,from()方法反之。

新舊日期類裝換方法見下表(表來自《 Java SE 8 for the Really Impatient》一書):


後記
未完待續。

參考資料
文章
Java SE 8 Date and Time | Java官方的文章,值得一讀
Java 8新的時間日期庫的20個使用示例
書籍
《 Java 8 in Action 》
《 Java SE 8 for the Really Impatient》
--------------------- 
作者:crane-yuan 
來源:CSDN 
原文:https://blog.csdn.net/u014717036/article/details/84728887 
版權宣告:本文為博主原創文章,轉載請附上博文連結!