2015-07-28 137 views
10

Java 8中有這種新的酷酷的Date API,java.time package。據我所知,它是設計得更好,比舊類更少模糊和更線程安全。不過,我不知道如何去使用它:Java 8日期API與日曆/日期/日期格式

  • 我應該專門用它來代替舊的類嗎?
  • 我是否應該替換舊類的現有用法,無論我發現它們是因爲新東西好多了?
  • 我應該從有利於新的API的使用java.util.Calendar, java.util.Datejava.sql.Datejava.text.DateFormat一起避免或者有沒有用例那裏的老班是更優選
  • 由於使用了新的Date API,所以Joda Time API已經過時了,類似於用Java 8流API替換Guava FluentIterable

我知道這些是很多問題,但他們感覺彼此有些相關。如果有人可以回答所有問題,那就太棒了,但是也可以讚賞部分答案。

+1

您是否正在使用現有的代碼庫 - 尤其是沒有良好測試的代碼庫 - 哪裏出現重要的重構會帶來風險? –

+0

我正在使用現有的代碼庫(沒有很好的測試覆蓋率)以及新項目。 –

回答

11

我應該專門用它來代替舊的類嗎?

不,不需要排除舊類。舊的java.util.Date/.Calendar工作原理相同,不變。已棄用而不是

您可以混合和匹配所有三個框架(舊類,Joda-Time和java.time)。只要注意一些相同或相似的類名 - 請留意你的import聲明!

請參閱教程,Legacy Date-Time Code

另外,ThreeTen-Extra項目還擴展了java.time和附加功能。 「ThreeTen」是指定義java.time的JSR 310

我應該更換舊類的現有用法嗎?無論我發現它們是因爲新東西好多了嗎?

如果舊代碼按預期工作,則無需現在更改。

如果您擔心舊代碼可能無法正確處理時區,或者想要執行更多本地化,則可能需要使用java.time重做它們。即使如此,請記住,您可以輕鬆地在j.u.Date和Instant之間進行轉換。因此,您可以使用j.u.Date/.Calendar原樣保留業務邏輯,只更改用戶表示代碼以使用java.time。

我是否應該避免使用java.util.Calendar,java.util.Date,java.sql.Date和java.text.DateFormat來支持新的API,或者是否存在使用舊的班還是比較好的?

您將需要舊的類與舊代碼和庫,期望舊類型的互操作。再次,舊的類不會被棄用,也不會消失。考慮到它們的廣泛使用和Java團隊的首要任務是保持向後兼容性,他們可能永遠不會離開。

新的java.time類遠遠優越,這就是爲什麼他們被添加。而且它們更合乎邏輯,更易於使用。所以是的,學習如何使用它們會是有益的和愉快的。但並不緊急。在緊縮時刻,按照習慣的方式編寫代碼。當你有時間學習(Tutorial)並執行額外的測試時,開始使用新的類。

新手程序員應該把重點放在java.time上。

由於新的Date API類似於用Java 8 stream API替換Guava FluentIterable,Joda Time API已經過時了嗎?

Joda-Time是java.time的靈感。同樣的人發明了這兩個。他們打算讓java.time成爲他們對Joda-Time的「2.0」重新發明,如果他們知道他們現在知道什麼,他們會怎麼做。他們說Joda-Time用戶應該轉換到java.time。

這就是說,喬達時間不會消失。它仍然在努力,仍然更新錯誤修復和新的時區數據tz。它是重要的大型Android社區沒有其他體面的日期時間庫(我知道)。所以你可以繼續依靠Joda-Time,沒有迫切需要撕掉舊代碼,但期望沒有新功能或增強功能。

喬達時代已經磨合並被證明,而java.time已經有了一些小錯誤和糾結。 Joda-Time和java.time每個都有另一個缺乏的功能。所以,我個人而言,我混合搭配最合適。在涉及java.time的時候,我依靠Joda-Time。

規劃一個最終轉換到java.time,但沒有急於,沒有恐慌。