Joda Time項目和java8時間api

  • 2019 年 10 月 6 日
  • 筆記

Joda Time出現的背景

在java1.0中,對日期和時間的支援只能依賴java.util.Date類。正如類名所表達的,這個類無法表示日期,只能以毫秒的精度表示時間。更糟糕的是它的易用性,由於某些未知的設計決策,這個類的易用性被深深的損害了,比如:年份的起始日期選擇是1990年,月份的起始從0開始。在java1.1中,Date類中的很多方法被廢棄了,取而代之的是java.util.Calendar類。Calendar類也有類似的問題和設計缺陷,導致使用這些方法寫出的程式碼非常容易出錯。比如月份依舊是從0開始計算(拿掉了由1990年開始計算年份這一設計)。更糟的是,有的特性只在某一個類有提供,比如用於語言無關方式格式化和解析日期或時間的DateFormat方法就只在Date類有。 DateFormat不是執行緒安全的,二個執行緒同時使用formatter解析日期,你可能會得到無法預期的結果。 在jdk1.8之前,這些問題使得用戶們使用了第三方日期和時間庫,比如Joda Time。jdk1.8大量借鑒了Joda Time特任。

Joda Time項目

Java SE 8之前的標準日期和時間類很差。通過解決這個問題,Joda-Time在Java SE 8之前成為Java的實際標準日期和時間庫。請注意,從Java SE 8起,用戶被要求遷移到java.time(JSR-310) – JDK的核心部分,取代了這個項目。如果我們工作中的jdk版本是1.8版本之前可以使用Joda Time項目,Joda項目中其實包括的不止Joda Time,還包括Joda-Money ,Joda-Beans,Joda-Convert ,Joda-Collect,Joda Primitives項目,有興趣可以在Joda官網地址中了解一下。

pom依賴:

第一個demo:

什麼是UTC時間? 沒有時區概念,比如utc時間 為2010-12-1T11:22:33.567Z,如果是表示時區概念一般2010-12-1T11:22:33.567+08:00

關於Joda Time其他的日期和時間api可以看其依賴包下的具體類,具體使用方式也很簡單看齊javadoc即可。

java8時間api

LocalDate,LocalTime

LocalDate類的實例是一個不可變的對象,只提供了簡單的日期,並不包含當前的時間資訊(只關注與年月日)。也不附帶任何與時區相關的資訊。 LocalTime類關注時分秒。

LocalDateTime

一個沒有時區概念的日期-時間類在ISO-8601 日期系統中,比如2007-12-03T10:15:30

機器的日期和時間格式

作為人,我們習慣與以星期幾,幾號,幾點,幾分這樣的方式理解日期和時間。對於電腦來說,建模時間最自然的格式是表示一個持續時間段上某個點的單一大整型數。這也是新的java.time.Instant類對時間建模的方式,基本上它是以Unix元年時間(傳統的設定為UTC時區1970年1月1日午夜時分)開始經歷的秒數進行計算。

Duration與Period

以年,月,日方式建模,可以使用Period類。

關於二者其他的api可以對照java api文檔進行查看,比較淺顯。

ZoneId和ZonedDateTime

新的java.time.ZoneId替代了老版本的java.util.TimeZone.

java8還提供了一些別的日曆系統,這些日曆系統中的每一個都有一個ThaiBuddhistDate,MinguoDate,JapaneseDate對應的日誌類。這邊不做介紹。

格式化與解析時間對象DateTimeFormatter

創建格式器最簡單的方法是通過DateTimeFormatter的靜態工廠方法以及常量。像BASIC_ISO_DATE 和ISO_LOCAL_DATE這 樣 的 常 量 是DateTimeFormatter類 的 預 定 義 實 例 。所 有 的 DateTimeFormatter實例都能用於以一定的格式創建代表特定日期或時間的字元串。

和老的java.util.DateFormat相比較,所有的DateTimeFormatter實例都是執行緒安全的。所以,你能夠以單例模式創建格式器實例,就像DateTimeFormatter所定義的那些常量,並能在多個執行緒間共享這些實例。DateTimeFormatter類還支援一個靜態工廠方法,它可以按照某個特定的模式創建格式器.

使用TemporalAdjuster類更精確的操縱日期

使用TemporalAdjuster類更精確的操縱日期,不在局限於一次只能改變它的一個只,並且你還可以按照需求定義自己的日期轉換器。

TemporalAdjusters工廠類為我們提供了很多便捷的操作。

next/previous 創建一個新的日期,並將其值設定為日期調整後或者調整前,第一個符合指定星 期幾要求的日期。 nextOrSame/previousOrSame 創建一個新的日期,並將其值設定為日期調整後或者調整前,第一個符合指定星 期幾要求的日期,如果該日期已經符合要求,直接返回該對象。

總結

java8提供的日期-時間對象是不可變的。操作的結果總是返回一個新的實列,老的日期時間對象不會發生改變。所以提供的這些類都很簡單,但是需要我們多去使用它。