1. 程式人生 > >JSR310 java8日期時間型別概念初探

JSR310 java8日期時間型別概念初探

Tiago Fernandez做過一次投票,選舉最爛的JAVA API,排第一的EJB2.X,第二的就是日期API。

原本的java日期API槽點太多,列舉有:

1.最開始的時候,Date既要承載日期資訊,又要做日期之間的轉換,還要做不同日期格式的顯示,職責較繁雜,違背單一原則

2.年份是從 1900 開始計算的而月份則從 0 開始

3關鍵的問題是可變性。參

public class Employee {
  private final Date startDate;
  public Employee(Date date) {
    startDate = date;
  }
  public Date getDate() {
    return startDate;
  }
}
即便將 startDate 標識為 final,但返回的 java.util.Date 例項依然是可變的,這樣在外面就可以通過呼叫 setYear() 修改僱員的起始日期。

JSR 310實際上有兩個日期概念。第一個是Instant,它大致對應於java.util.Date類,因為它代表了一個確定的時間點,即相對於標準Java紀元(1970年1月1日)的偏移量;但與java.util.Date類不同的是其精確到了納秒級別。

第二個對應於人類自身的觀念,比如LocalDate和LocalTime。他們代表了一般的時區概念,要麼是日期(不包含時間),要麼是時間(不包含日期),類似於java.sql的表示方式。此外,還有一個MonthDay,它可以儲存某人的生日(不包含年份)。每個類都在內部儲存正確的資料而不是像java.util.Date那樣利用午夜12點來區分日期,利用1970-01-01來表示時間。

目前Java8已經實現了JSR310的全部內容。新增了java.time包定義的類表示了日期-時間概念的規則,包括instants, durations, dates, times, time-zones and periods。這些都是基於ISO日曆系統,它又是遵循 Gregorian規則的。最重要的一點是值不可變,且執行緒安全,通過下面一張圖,我們快速看下java.time包下的一些主要的類的值的格式,方便理解。