Java 終於有了直覺、可靠的方式來處理日期和時間。日期和時間的原則是許多應用程式的基礎。出生日期、租賃日期、活動時間和商店營業時間等各種資訊都基於日期和時間,但Java SE並沒有提供使用它們的便利方法。從Java SE 8開始,出現了一組java.time套件,它們提供了一個結構良好的API來處理日期和時間。
以下是其實施中存在的一小部分問題:
背景
當Java首次出現時,在版本1.0中,唯一用於處理日期和時間的類別是java.util.Date。開發人員注意到的第一件事是它並不代表“日期”。事實上,它代表的是從 1970 年 1 月 1 日開始測量的一個時刻,精確到毫秒。然而,基於Date的toString()方法顯示機器的java設定中指定的時區的日期和時間,一些開發人員錯誤地認為Date可以與時區一起工作。事實證明修復這個類別非常困難(或者說非常懶),以至於在1.1版本中我們必須添加一個新類別 - java.util.Calendar。不幸的是,Calendar類結果並不比Date好多少。- 多變。日期和時間等類別應該是不可變的。
- 偏移量。Date 中的年份從 1900 年開始,兩個類別中的月份都從零開始。
- 名字。Date 實際上並不是“日期”,Calendar 也不是日曆。
- 格式化。格式化僅適用於日期,不適用於日曆,並且不是線程安全的。
審查
新的 java.time API包含 5 個套件:- java.time - 包含用於儲存值的物件的基礎包
- java.time.chrono - 提供不同日曆的訪問
- java.time.format - 日期和時間格式化和識別
- java.time.temporal - 低階函式庫與進階功能
- java.time.zone - 用於處理時區的類
日期
LocalDate 類別是新 API中最重要的類別之一。它包含一個表示日期的不可變值。您無法設定時間或時區。「local」這個名字你可能對 Joda-Time很熟悉,原本來自 ISO-8601標準。這恰恰意味著沒有時區。本質上, LocalDate是對日期的描述,例如「2014 年 4 月 5 日」。該日期的實際時間將根據您所在的時區而有所不同。例如,在澳大利亞,該日期將比倫敦早 10 小時,比舊金山早 18 小時。 LocalDate類別有所有常用的方法:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
在我們的範例中,我們看到使用工廠方法建立的日期(所有建構函式都是私有的)。接下來我們向物件詢問一些數據。請注意,
Month和
DayOfWeek枚舉旨在使程式碼更具可讀性和可靠性。在下面的例子中我們將看到如何修改日期。由於類別是不可變的,因此結果將是新對象,但原始對象將保持原樣。
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
這些都是相對簡單的更改,但通常您需要進行更複雜的日期修改。
java.time API中有一個特殊的機制- TemporalAdjuster 。它的目的是提供一個內建工具,讓您可以操作日期,例如取得與該月最後一天相對應的物件。其中一些包含在
API中,但您可以添加自己的。使用修飾符非常簡單,但它需要靜態導入:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
使用修飾符可以極大地簡化您的程式碼。沒有人願意看到大量的手動日期操作。如果某種類型的日期操作在您的專案中多次發生,請編寫您自己的修改器,您的團隊可以將其用作已編寫和測試的元件。
GO TO FULL VERSION