Java 8 Time API

Java 8 系列文章 持續更新中
日期時間API 也是Java 8重要的更新之一,Java從一開始就缺少一致的日期和時間方法,Java 8 Date Time API是Java核心API的一個非常好的補充 。
為什么需要新的日期時間APIJava中現有的與日期和時間相關的類存在一些問題:

  • 日期時間類的定義不一致,在java.utiljava.sql包中都有Date類 。同樣,格式化和解析類是在java.text包中定義的 。
  • java.util.Date同時包含日期和時間值 , 而java.sql.Date只包含日期值,把它放在java.sql包中是沒有意義的 。而且這兩個類的名稱相同,這本身就是一個非常糟糕的設計 。
  • 沒有為時間、時間戳、格式化和解析明確定義的類 。我們有java.text.DateFormat抽象類用于解析和格式化,通常使用SimpleDateFormat類解析和格式化 。
  • 所有Date類都是可變的 , 所以它們不是線程安全的 , 這也是JavaDateCalendar類最大的問題之一 。
  • Date類不提供國際化,不支持時區 。雖然引入了java.util.Calendarjava.util.TimeZone,但是它們也存在上面的問題 。
DateCalendar類中定義的方法還有一些其他的問題,但是上面的問題清楚地表明,Java中需要一個健壯的日期時間API 。這就是為什么 Joda Time 可以成為Java 日期時間高質量的替代品 。
Java 8日期時間設計原則Java 8日期時間API是基于 JSR-310 規范實現的 。目的是為了解決遺留日期時間實現中的所有缺陷 。新的日期時間API的一些設計原則如下:
  • 不變性:新的日期時間API中的所有類都是不可變的,適用于多線程環境 。
  • 關注點分離:新的日期時間API明確區分了人類可讀的日期、時間和機器時間(Unix時間戳) , 它為Date、Time、DateTime、Timestamp、Timezone 等定義單獨的類 。
  • 清晰性:所有的類中都清晰地定義了方法 , 并執行相同的操作 。例如 , 要獲取當前時間實例可以用now()方法,在所有這些類中都定義了format()parse()方法,而不是為它們單獨定義一個類 。
    所有類都使用工廠模式和策略模式來更好地操作 。一旦您使用了其中一個類中的方法,使用其他類并不困難 。
  • 實用的操作:所有新的日期時間API類都常見的方法,比如加、減、格式化、解析、在日期/時間中獲取單獨的部分等等 。
  • 可擴展:新的日期時間API可以在ISO-8601日歷系統上工作 , 但是我們也可以在其他非ISO日歷上使用它 。
Java 8日期時間API的包Java8日期時間API由以下包組成 。
  • java.time:這是Java 8日期時間API的基本包 。所有主要的基類都是這個包的一部分,例如LocalDateLocalTime、LocalDateTimeInstant、Period、Duration等 。所有這些類都是不可變的和線程安全的 。大多數情況下,這些類足以處理常見的需求 。
  • java.time.chrono:這個包為非ISO日歷系統定義了通用API 。我們可以擴展AbstractChronology類來創建我們自己的日歷系統 。
  • java.time.format:這個包包含用于格式化和解析日期時間對象的類 。大多數時候我們不會直接使用它們,因為java.time包中的日期時間類已經提供了格式化和解析方法 。
  • java.time.temporal:這個包包含temporal對象 , 我們可以使用它來找出與日期/時間對象相關的特定日期或時間 。例如 , 我們可以使用它們來查找一個月的第一天或最后一天 。您可以很容易地識別這些方法,因為它們的格式總是withXXX 。
  • java.time.zone:這個包包含用于支持不同時區及其規則的類 。
Java 8日期時間API類的示例下面通過一些日期時間API類的示例,來更好的了解Java 8日期時間API
1.LocalDateLocalDate是一個不可變的日期類,它以yyyy-MM-dd的默認格式表示日期 。可以使用now()方法來獲取當前日期,還可以提供年、月和日期的輸入參數來創建LocalDate實例 。
這個類為now()提供了一個重載方法,在這里可以傳遞ZoneId來獲取特定時區中的日期 。這個類提供了與

推薦閱讀