Java™ 教程(Date-Time)

Date-Time

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中的核心類有LocalDateTimeZonedDateTimeOffsetDateTime等,全部這些都使用ISO日曆系統。若是你想使用其餘日曆系統,例如Hijrah或Thai Buddhist,java.time.chrono包容許你使用其中一個預約義的日曆系統,或者你能夠建立本身的。segmentfault

Date-Time API使用Unicode公共語言環境數據存儲庫(CLDR),這個存儲庫支持全世界的語言,幷包含全世界最大的可用語言環境數據集合,此存儲庫中的信息已本地化爲數百種語言。Date-Time API還使用時區數據庫(TZDB),該數據庫提供了自1970年以來全球每一個時區變化的信息,以及自引入該概念以來的主要時區的歷史記錄。api

Date-Time設計原則

Date-Time API是使用幾個設計原則開發的。安全

明確

API中的方法定義明確,其行爲清晰且預期,例如,使用null參數值調用Date-Time方法一般會觸發NullPointerExceptionoracle

流暢

Date-Time API提供了流暢的接口,使代碼易於閱讀,由於大多數方法不容許具備null值的參數而且不返回null值,因此能夠將方法調用連接在一塊兒,而且能夠快速理解生成的代碼,例如:框架

LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);

不可變

Date-Time API中的大多數類建立的對象不可變,這意味着在建立對象後,它不能被修改,要更改不可變對象的值,必須將新對象構造爲原始對象的修改副本。這也意味着根據定義,Date-Time API是線程安全的。這會影響API,由於用於建立日期或時間對象的大多數方法都以forfromwith做爲前綴,而不是構造函數,而且沒有set方法,例如:函數

LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);

可擴展

Date-Time API儘量是可擴展的,例如,你能夠定義本身的時間調整器和查詢,或構建本身的日曆系統。線程

Date-Time包

Date-Time API由主包java.time和四個子包組成:

java.time

  • 用於表示日期和時間的核心API,它包括日期、時間、日期和時間組合、時區、時刻,持續時間和時鐘的類,這些類基於ISO-8601中定義的日曆系統,而且是不可變的和線程安全的。

java.time.chrono

  • 用於表示除默認ISO-8601以外的日曆系統的API,你還能夠定義本身的日曆系統,本教程未詳細介紹此包。

java.time.format

  • 用於格式化和解析日期和時間的類。

java.time.temporal

  • 擴展API,主要用於編寫框架和庫,容許日期和時間類之間的互操做、查詢和調整,字段(TemporalFieldChronoField)和單元(TemporalUnitChronoUnit)在此包中定義。

java.time.zone

  • 支持時區、時區偏移和時區規則的類,若是使用時區,大多數開發人員只須要使用ZonedDateTimeZoneIdZoneOffset

方法命名約定

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 實例 將此對象與另外一個對象組合。
相關文章
相關標籤/搜索