首先,不得不認可,這確實是類庫設計的一個錯誤,因此「爲何」進行了這個錯誤設計並無意義。但沒有事物一誕生就是完美的,咱們的Java只是反應的慢了一點,再慢了一點。
更況且,Date類等日期/時間API又不是隻有這一個問題。html
Java8以前,日期/時間API的問題
在Java8以前,日期和時間相關的類存在諸多問題:java
- Java的日期/時間類的定義並不一致,在java.util和java.sql的包中都有日期類,此外用於格式化和解析的類在java.text包中定義。
- java.util.Date同時包含日期和時間,而java.sql.Date僅包含日期,將其歸入java.sql包並不合理。另外這兩個類都有相同的名字,這自己就是一個很是糟糕的設計。
- 對於時間、時間戳、格式化以及解析,並無一些明肯定義的類。對於格式化和解析的需求,咱們有java.text.DateFormat抽象類,但一般狀況下,SimpleDateFormat類被用於此類需求。
- 全部的日期類都是可變的,所以他們都不是線程安全的,這是Java日期類最大的問題之一。
- 日期類並不提供國際化,沒有時區支持,所以Java引入了java.util.Calendar和java.util.TimeZone類,但他們一樣存在上述全部的問題。
限於篇幅,還有一些問題沒有提到,但以上問題已經很清晰地代表:git
Java須要一個健壯的日期/時間類。這也是爲何Joda Time在Java日期/時間需求中扮演了高質量替換的重要角色。github
Java8嶄新的日期/時間API
Java 8日期/時間API是JSR-310的實現,它的實現目標是克服舊的日期時間實現中全部的缺陷。sql
新的日期/時間API的一些設計原則是:api
- 不變性:新的日期/時間API中,全部的類都是不可變的,這對多線程環境有好處。
- 關注點分離:新的API將人可讀的日期時間和機器時間(unix timestamp)明確分離,它爲日期(Date)、時間(Time)、日期時間(DateTime)、時間戳(unix timestamp)以及時區定義了不一樣的類。
- 清晰:在全部的類中,方法都被明肯定義用以完成相同的行爲。舉個例子,要拿到當前實例咱們可使用now()方法,在全部的類中都定義了format()和parse()方法,而不是像之前那樣專門有一個獨立的類。爲了更好的處理問題,全部的類都使用了工廠模式和策略模式,一旦你使用了其中某個類的方法,與其餘類協同工做並不困難。
- 實用操做:全部新的日期/時間API類都實現了一系列方法用以完成通用的任務,如:加、減、格式化、解析、從日期/時間中提取單獨部分,等等。
- 可擴展性:新的日期/時間API是工做在ISO-8601日曆系統上的,但咱們也能夠將其應用在非ISO的日曆上。
具體應用不表。安全
參考:多線程
本文連接:Date類爲何設計爲可變的,而不是像String同樣?
做者:猴子007
出處:https://monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議發佈,歡迎轉載,演繹或用於商業目的,可是必須保留本文的署名及連接。線程