Java SE 8發行版中引入的Date-Time包java.time提供了全面的日期和時間模型,是在JSR 310:Date and Time API下開發的,儘管java.time
基於國際標準化組織(ISO)日曆系統,但也支持經常使用的全球日曆。html
此課程介紹了使用基於ISO的類來表示日期和時間以及操做日期和時間值的基本原理。java
時間彷佛是一個簡單的主題,即使是便宜的手錶也能提供合理準確的日期和時間,可是,經過仔細研究,你會發現微妙的複雜性和許多影響你理解時間的因素。例如,在1月31日添加一個月的結果對於閏年而言與其餘年份不一樣,時區也增長了複雜性,例如,一個國家可能會在短期內進出夏令時,或者一年屢次進入夏令時,或者可能在某一年內徹底跳過夏令時。數據庫
Date-Time API使用ISO-8601中定義的日曆系統做爲默認日曆,此日曆基於公曆系統,並在全球範圍內用做表示日期和時間的事實標準。Date-Time API中的核心類有LocalDateTime
、ZonedDateTime
和OffsetDateTime
等,全部這些都使用ISO日曆系統。若是你想使用其餘日曆系統,例如Hijrah或Thai Buddhist,java.time.chrono
包容許你使用其中一個預約義的日曆系統,或者你能夠建立本身的。segmentfault
Date-Time API使用Unicode公共語言環境數據存儲庫(CLDR),這個存儲庫支持全世界的語言,幷包含全世界最大的可用語言環境數據集合,此存儲庫中的信息已本地化爲數百種語言。Date-Time API還使用時區數據庫(TZDB),該數據庫提供了自1970年以來全球每一個時區變化的信息,以及自引入該概念以來的主要時區的歷史記錄。api
Date-Time API是使用幾個設計原則開發的。安全
API中的方法定義明確,其行爲清晰且預期,例如,使用null
參數值調用Date-Time方法一般會觸發NullPointerException
。oracle
Date-Time API提供了流暢的接口,使代碼易於閱讀,由於大多數方法不容許具備null
值的參數而且不返回null
值,因此能夠將方法調用連接在一塊兒,而且能夠快速理解生成的代碼,例如:框架
LocalDate today = LocalDate.now(); LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
Date-Time API中的大多數類建立的對象不可變,這意味着在建立對象後,它不能被修改,要更改不可變對象的值,必須將新對象構造爲原始對象的修改副本。這也意味着根據定義,Date-Time API是線程安全的。這會影響API,由於用於建立日期或時間對象的大多數方法都以for
、from
或with
做爲前綴,而不是構造函數,而且沒有set
方法,例如:函數
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14); LocalDate firstBirthday = dateOfBirth.plusYears(1);
Date-Time API儘量是可擴展的,例如,你能夠定義本身的時間調整器和查詢,或構建本身的日曆系統。線程
Date-Time API由主包java.time
和四個子包組成:
java.time
java.time.chrono
java.time.format
java.time.temporal
TemporalField
和ChronoField
)和單元(TemporalUnit
和ChronoUnit
)在此包中定義。java.time.zone
ZonedDateTime
、ZoneId
或ZoneOffset
。Date-Time API在一組豐富的類中提供了一組豐富的方法,儘量在類之間使方法名一致,例如,許多類提供了一個now
方法,用於捕獲與該類相關的當前時刻的日期或時間值,from
方法容許從一個類轉換到另外一個類。
關於方法名稱前綴也有標準化,因爲Date-Time API中的大多數類都是不可變的,所以API不包含set
方法(建立後,沒法更改不可變對象的值,set
方法的不可變等價是with
),下表列出了經常使用的前綴:
前綴 | 方法類型 | 使用 |
---|---|---|
of |
靜態工廠 | 建立一個實例,其中工廠主要驗證輸入參數,而不是轉換它們。 |
from |
靜態工廠 | 將輸入參數轉換爲目標類的實例,這可能涉及從輸入中丟失信息。 |
parse |
靜態工廠 | 解析輸入字符串以生成目標類的實例。 |
format |
實例 | 使用指定的格式化程序來格式化時間對象中的值以生成字符串。 |
get |
實例 | 返回目標對象狀態的一部分。 |
is |
實例 | 查詢目標對象的狀態。 |
with |
實例 | 返回更改了一個元素的目標對象的副本; 這是JavaBean上 set 方法的不可變等價物。 |
plus |
實例 | 返回添加時間量的目標對象的副本。 |
minus |
實例 | 返回減去時間量的目標對象的副本。 |
to |
實例 | 將此對象轉換爲另外一種類型。 |
at |
實例 | 將此對象與另外一個對象組合。 |