Date-Time
Java SE 8發(fā)行版中引入的Date-Time包java.time提供了全面的日期和時間模型,是在JSR 310:Date and Time API下開發(fā)的,盡管java.time基于國際標準化組織(ISO)日歷系統(tǒng),但也支持常用的全球日歷。
此課程介紹了使用基于ISO的類來表示日期和時間以及操作日期和時間值的基本原理。
概述時間似乎是一個簡單的主題,即便是便宜的手表也能提供合理準確的日期和時間,但是,通過仔細研究,你會發(fā)現(xiàn)微妙的復雜性和許多影響你理解時間的因素。例如,在1月31日添加一個月的結果對于閏年而言與其他年份不同,時區(qū)也增加了復雜性,例如,一個國家可能會在短時間內(nèi)進出夏令時,或者一年多次進入夏令時,或者可能在某一年內(nèi)完全跳過夏令時。
Date-Time API使用ISO-8601中定義的日歷系統(tǒng)作為默認日歷,此日歷基于公歷系統(tǒng),并在全球范圍內(nèi)用作表示日期和時間的事實標準。Date-Time API中的核心類有LocalDateTime、ZonedDateTime和OffsetDateTime等,所有這些都使用ISO日歷系統(tǒng)。如果你想使用其他日歷系統(tǒng),例如Hijrah或Thai Buddhist,java.time.chrono包允許你使用其中一個預定義的日歷系統(tǒng),或者你可以創(chuàng)建自己的。
Date-Time API使用Unicode公共語言環(huán)境數(shù)據(jù)存儲庫(CLDR),這個存儲庫支持全世界的語言,并包含全世界最大的可用語言環(huán)境數(shù)據(jù)集合,此存儲庫中的信息已本地化為數(shù)百種語言。Date-Time API還使用時區(qū)數(shù)據(jù)庫(TZDB),該數(shù)據(jù)庫提供了自1970年以來全球每個時區(qū)變化的信息,以及自引入該概念以來的主要時區(qū)的歷史記錄。
Date-Time設計原則Date-Time API是使用幾個設計原則開發(fā)的。
明確API中的方法定義明確,其行為清晰且預期,例如,使用null參數(shù)值調用Date-Time方法通常會觸發(fā)NullPointerException。
流暢Date-Time API提供了流暢的接口,使代碼易于閱讀,因為大多數(shù)方法不允許具有null值的參數(shù)并且不返回null值,所以可以將方法調用鏈接在一起,并且可以快速理解生成的代碼,例如:
LocalDate today = LocalDate.now(); LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);不可變
Date-Time API中的大多數(shù)類創(chuàng)建的對象不可變,這意味著在創(chuàng)建對象后,它不能被修改,要更改不可變對象的值,必須將新對象構造為原始對象的修改副本。這也意味著根據(jù)定義,Date-Time API是線程安全的。這會影響API,因為用于創(chuàng)建日期或時間對象的大多數(shù)方法都以for、from或with作為前綴,而不是構造函數(shù),并且沒有set方法,例如:
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14); LocalDate firstBirthday = dateOfBirth.plusYears(1);可擴展
Date-Time API盡可能是可擴展的,例如,你可以定義自己的時間調整器和查詢,或構建自己的日歷系統(tǒng)。
Date-Time包Date-Time API由主包java.time和四個子包組成:
java.time
用于表示日期和時間的核心API,它包括日期、時間、日期和時間組合、時區(qū)、時刻,持續(xù)時間和時鐘的類,這些類基于ISO-8601中定義的日歷系統(tǒng),并且是不可變的和線程安全的。
java.time.chrono
用于表示除默認ISO-8601之外的日歷系統(tǒng)的API,你還可以定義自己的日歷系統(tǒng),本教程未詳細介紹此包。
java.time.format
用于格式化和解析日期和時間的類。
java.time.temporal
擴展API,主要用于編寫框架和庫,允許日期和時間類之間的互操作、查詢和調整,字段(TemporalField和ChronoField)和單元(TemporalUnit和ChronoUnit)在此包中定義。
java.time.zone
支持時區(qū)、時區(qū)偏移和時區(qū)規(guī)則的類,如果使用時區(qū),大多數(shù)開發(fā)人員只需要使用ZonedDateTime、ZoneId或ZoneOffset。
方法命名約定Date-Time API在一組豐富的類中提供了一組豐富的方法,盡可能在類之間使方法名一致,例如,許多類提供了一個now方法,用于捕獲與該類相關的當前時刻的日期或時間值,from方法允許從一個類轉換到另一個類。
關于方法名稱前綴也有標準化,由于Date-Time API中的大多數(shù)類都是不可變的,因此API不包含set方法(創(chuàng)建后,無法更改不可變對象的值,set方法的不可變等價是with),下表列出了常用的前綴:
前綴 | 方法類型 | 使用 |
---|---|---|
of | 靜態(tài)工廠 | 創(chuàng)建一個實例,其中工廠主要驗證輸入?yún)?shù),而不是轉換它們。 |
from | 靜態(tài)工廠 | 將輸入?yún)?shù)轉換為目標類的實例,這可能涉及從輸入中丟失信息。 |
parse | 靜態(tài)工廠 | 解析輸入字符串以生成目標類的實例。 |
format | 實例 | 使用指定的格式化程序來格式化時間對象中的值以生成字符串。 |
get | 實例 | 返回目標對象狀態(tài)的一部分。 |
is | 實例 | 查詢目標對象的狀態(tài)。 |
with | 實例 | 返回更改了一個元素的目標對象的副本; 這是JavaBean上set方法的不可變等價物。 |
plus | 實例 | 返回添加時間量的目標對象的副本。 |
minus | 實例 | 返回減去時間量的目標對象的副本。 |
to | 實例 | 將此對象轉換為另一種類型。 |
at | 實例 | 將此對象與另一個對象組合。 |
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/73084.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續(xù)版本中引入的改進。 Java教程是希望使用Java編程語言創(chuàng)建應用程序的程序員的實用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關課程組被組織成教程。 覆蓋基礎知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術和安裝Java開發(fā)軟件并使用...
摘要:上一篇文章,小樂給大家?guī)砹诵绿匦灾?,接下來本文將會給大家介紹新特性之前言通過發(fā)布新的來進一步加強對日期與時間的處理。 上一篇文章,小樂給大家?guī)砹薐ava8新特性之Optional,接下來本文將會給大家介紹Java8新特性之Date API 前言: Java 8通過發(fā)布新的Date-Time API來進一步加強對日期與時間的處理。 舊版的 Java 中,日期時間 API 存在諸多問題...
摘要:中基于的自動實體類構建與接口文檔生成是筆者對于開源項目的描述,對于不反感使用注解的項目中利用添加合適的實體類或者接口類注解,從而實現(xiàn)支持嵌套地實體類校驗與生成等模型生成基于的接口文檔生成等等功能。 JavaScript 中基于 swagger-decorator 的自動實體類構建與 Swagger 接口文檔生成是筆者對于開源項目 swagger-decorator 的描述,對于不反感使...
閱讀 3755·2021-11-22 13:52
閱讀 3628·2019-12-27 12:20
閱讀 2401·2019-08-30 15:55
閱讀 2154·2019-08-30 15:44
閱讀 2271·2019-08-30 13:16
閱讀 585·2019-08-28 18:19
閱讀 1893·2019-08-26 11:58
閱讀 3447·2019-08-26 11:47