因為Jdk7及以前的日期時間類的不方便使用問題和線程安全問題等問題,2005年,Stephen Colebourne創建了Joda-Time庫,作為替代的日期和時間API。Stephen向JCP提交了一個規范,他本人作為規范的領導人,該規范就是JSR 310,在Java8中實現並發布。
1.Java8日期、時間API包介紹
- java.time包:這是新的Java日期/時間API的基礎包,所有的主要基礎類都是這個包的一部分,如:LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration等等。所有這些類都是不可變的和線程安全的,在絕大多數情況下,這些類能夠有效地處理一些公共的需求。
- java.time.chrono包:這個包為非ISO的日歷系統定義了一些泛化的API,我們可以擴展AbstractChronology類來創建自己的日歷系統。
- java.time.format包:這個包包含能夠格式化和解析日期時間對象的類,在絕大多數情況下,我們不應該直接使用它們,因為java.time包中相應的類已經提供了格式化和解析的方法。
- java.time.temporal包:這個包包含一些時態對象,我們可以用其找出關於日期/時間對象的某個特定日期或時間,比如說,可以找到某月的第一天或最后一天。你可以非常容易地認出這些方法,因為它們都具有“withXXX”的格式。
- java.time.zone包:這個包包含支持不同時區以及相關規則的類
2.Java8日期時間API主要類有:
LocalDate:表示不帶時間的日期
LocalTime:表示不帶日期的時間
LocalDateTime:日期和時間類
ZoneId:時區
ZonedDateTime:一個帶時區的完整時間
Instant:Unix 時間,它代表的是時間戳,比如 2018-01-14T02:20:13.592Z
Clock:獲取某個時區下當前的瞬時時間,日期或者時間
Duration:表示一個絕對的精確跨度,使用毫秒為單位
Period:這個類表示與 Duration 相同的概念,但是以人們比較熟悉的單位表示,比如年、月、周
DateTimeFormatter:格式化輸出
TemporalAdjusters:獲得指定日期時間等,如當月的第一天、今年的最后一天等
ChronoUnit:時間單位枚舉,用於加減操作
ChronoField:字段枚舉,用於設置字段值。
主要類圖:
時間范圍示意圖:
參考:https://www.iteye.com/news/26064
https://segmentfault.com/a/1190000020179839
《Java8實戰》
https://blog.csdn.net/wangsun300/article/details/103403490