Java 8 | Date/Time API(JSR 310)
Java 8
引入了新的Date-Time API(JSR 310)
來改進時間、日期的處理。時間和日期的管理一直是最令Java
開發者痛苦的問題。java.util.Date
和後來的java.util.Calendar
一直沒有解決這個問題(甚至令開發者更加迷茫)。
因為上面這些原因,誕生了第三方庫Joda-Time
,可以替代Java
的時間管理API
。 Java 8
中新的時間和日期管理API
深受Joda-Time
影響,並吸收了很多Joda-Time
的精華。新的java.tim
e包包含了所有關於日期、時間、時區、Instant
(跟日期類似但是精確到納秒)、duration
(持續時間)和時鐘操作的類。新設計的API認真考慮了這些類的不變性(從java.util.Calendar
吸取的教訓),如果某個實例需要修改,則返回一個新的對象。
在舊版的Java
中,日期時間 API
存在諸多問題,其中有:
非線程安全:
java.util.Date
是非線程安全的,所有的日期類都是可變的,這是Java
日期類最大的問題之一。設計很差:
Java
的日期/時間類的定義並不一致,在java.util
和java.sql
的包中都有日期類,此外用於格式化和解析的類在java.text
包中定義。java.util.Date
同時包含日期和時間,而java.sql.Date
僅包含日期,將其納入java.sql
包並不合理。另外這兩個類都有相同的名字,這本身就是一個非常糟糕的設計。時區處理麻煩:日期類並不提供國際化,沒有時區支持,因此Java引入了
java.util.Calendar
和java.util.TimeZone
類,但他們同樣存在上述所有的問題。
Java 8
在java.time
包下提供了很多新的API
。以下為兩個比較重要的API
:
Local
(本地):簡化了日期時間的處理,沒有時區的問題。Zoned
(時區):通過制定的時區處理日期時間。
新的java.time
包涵蓋了所有處理日期,時間,日期/時間,時區,時刻(instants
),過程(during
)與時鐘(clock
)的操作。
Clock
Clock
類使用時區來返回當前的納秒時間和日期。Clock
可以替代System.currentTimeMillis()
和TimeZone.getDefault()
。
1 | // Get the system clock as UTC offset |
輸出的結果為:(我目前時區為GMT+8[Asia/Taipei])
1 | 2020-04-10T13:38:58.906Z |
LocalDate / LocalTime
LocalDate
僅僅包含ISO-8601
日曆系統中的日期部分;LocalTime
則僅僅包含該日曆系統中的時間部分。這兩個類的對像都可以使用Clock
對象構建得到。LocalDate
/LocalTime
和LocalDateTime
類可以在處理時區不是必須的情況。
1 | // Get the system clock as UTC offset |
輸出的結果為:(我目前時區為GMT+8[Asia/Taipei])
1 | 2020-04-10 |
LocalDateTime
LocalDateTime
類包含了LocalDate
和LocalTime
的信息,但是不包含ISO-8601
日曆系統中的時區信息。
關於於LocalDate和LocalTime的例子可以參考此篇文章。
1 | // Get the system clock as UTC offset |
輸出的結果為:(我目前時區為GMT+8[Asia/Taipei])
1 | 2020-04-10T21:45:35.622 |
ZoneDateTime
如果你需要特定時區的data/time
信息,則可以使用ZoneDateTime
,它保存有ISO-8601
日期系統的日期和時間,而且有時區信息。
1 | // Get the system clock as UTC offset |
輸出的結果為:(我目前時區為GMT+8[Asia/Taipei])
1 | 2020-04-10T21:48:27.269+08:00[Asia/Taipei] |
Duration
Duration
類,它持有的時間精確到秒和納秒。這使得我們可以很容易得計算兩個日期之間的不同,
1 | // Get duration between two dates |
註:是import java.time.Duration;。
輸出的結果為:(我目前時區為GMT+8[Asia/Taipei])
1 | Duration in days: 365 |
註:以上參考了
Stream 與平行化
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南