<b>閱讀目錄</b>
<a href="http://www.cnblogs.com/java-class/p/4845962.html#_label0">1. dateformatutils 和 fastdateformat </a>
<a href="http://www.cnblogs.com/java-class/p/4845962.html#_label1">2. dateutils</a>
<a href="http://www.cnblogs.com/java-class/p/4845962.html#_label2">3. durationformatutils 和 stopwatch </a>
java的時間日期處理一直是一個比較複雜的問題,大多數程式員都不能很輕松的來處理這些問題。首先java中關于時間的類,從 jdk 1.1 開始,date的作用很有限,相應的功能已由calendar與dateformat代替。使用calendar類實作日期和時間字段之間轉換,使用 dateformat 類來格式化和分析日期字元串。
calendar 類是一個抽象類,它為特定瞬間與一組諸如 year、month、day_of_month、hour 等 月曆字段之間的轉換提供了一些方法,并為操作月曆字段(例如獲得下星期的日期)提供了一些方法。
timezone : 表示時區偏移量。
locale : 表示了特定的地理、政治和文化地區。需要 locale 來執行其任務的操作稱為語言環境敏感的操作,它使用 locale 為使用者量身定制資訊。
simpledateformat : 主要是用來格式化date,用過之後就會發現,它其實不完善,對calendar提供的支援很少.
經曆幾個項目發現apache提供的第三方擴充類庫,org.apache.commons.lang.time包比較好用,可以将程式中時間處理變的簡單一點,提高你的開發效率,下面介紹下常用的方法和具體使用。
org.apache.commons.lang.time 包括以下幾個類:
a. dateformatutils 【格式化calendar與date并依賴于 fastdateformat】
b. dateutils 【圍繞calendar與date的實用方法】
c. durationformatutils 【毫秒數格式化calendar與date】
d. fastdateformat 【線程安全的simpledateformat】
e. stopwatch 【提供一個友善的定時的api 】
dateformatutils相對來說比較簡單,它的方法全部都是static的,是以不需要用構造器建立新的執行個體,但它構造器卻是public的,這并不是說我們應該在程式中使用它,官方文檔已說明,它是為了與其它工具的內建的準備的。它包括的方法主要就是format。主要用途就是根據傳入的pattern格式化date或calendar。也可以有一些附加的參數,如locale,timezone。
函數定義:
原來項目中是這樣寫的:
現在可以這樣寫:
dateformatutils預定義的日期格式有9種之多,基本能滿足項目時間格式化的要求,當然也可以自己自定義格式:
是以上面的也可以這樣寫:
dateformatutils 預定義的日期格式,通過公有的靜态final字段來暴露這些常量簡化了類的使用,但是卻有一些地方是需要注意的,在這方面fastdateformat做得還是相當不錯的。要使final字段真正的不可變,
a. 這些字段是基本類型的值(int,string等),
b. 指向一個不可變對象的引用。
c. 需要注意的特殊情況是,長度為零的數組總是可變的,要麼通過不可變的collection來包裝,
要麼使數組變成私有的,并添加一個公有的方法,傳回一個數組的備份,這在effective java上的item 15上有詳細的介紹。上面的final 字段代表一個不可變的fastdateformat,然而要讓fastdateformat字段真正的不可變,
fastdateformat内部必須遵循相應的規則才可以。
a. 不要提供能修改對象狀态的方法
b. 確定類不會被繼承
c. 讓所有字段都成為static final字段
d. 確定所有可變的元件不能被通路
詳細介紹可參考effective java第二版的item 15。仔細檢視,會發現fastdateformat都遵循這些規則,而effective java 2rd 的出版也在commons-lang 2.4 開發之後,這說明 commons-lang的代碼品質還是相當值得肯定的。
其實dateformateutils内部細節實作完全依靠fastdateformat,dateformateutils隻是把一些常用的格式化功能單獨組織起來,讓日期時間的使用變得簡單,畢竟大多數時候使用者檢視api時,如果有太多的方法,會給他們紛繁複雜的感覺。如果需要更加強大靈活的日期格式化功能,可以直接使用fastdateformat,fastdateformat這個類編寫比較複雜,它有自己的一套解析規則,同時又使用了dateformat類的一些規則,如pattern。與simpledateformat不同,
fastdateformat是線程安全,是以這個類在多線程的服務環境中特别有用。
雖然它們都繼承自java.text.format,其實fastdateformat相當于dateformat與simpledateformat的合并,隻是功能更強大而已。如果是從dateformat遷移到fastdateformat的話,還是有一些地方需要注意的,
比如,date(string date)被dateformat.parse(string s) 取代了,仔細檢視,fastdateformat并沒有類似的方法,其實準确的說,把日期解析放在dateformat本身就不太合理,不看文檔的話,大多數人都會認為date應該提供該功能。是以commons-lang把它放在了dateutils 類中,對應方法則更加的強大:
eg:
因parsepatterns可以包括多種pattern,隻要滿足其中的一種即可。如果使用simpledateformat,則先要通過simpledateformat(string str)建立執行個體,然後通過applypattern(string pattern)來變換不同的pattern。
dateutils提供了很多很友善的功能,減輕了使用date的複雜性。把原來需用calendar才能完成的功能統一集中了起來,也就是說沒有對應的calendarutils類。在jdk中,date與calendar概念本身就有些混淆,隻是為了保持相容性才引入的calendar。相對于calendar提供的方法,dateutils提供了更加合理的方法,
對時間的單個字段操作變得更加的容易。如需要修改時間date的某個字段,必須先獲得date對象執行個體,再傳入calendar,才能修改,如:
在這方面commons-lang的确做得很完善,現在可以這樣寫:
eg:
方法名也非常的直覺,使用也更加友善了。但有一些方法不是很好了解,就像下面這個函數:
當然在dateutils也有一些一看就知道是做什麼的函數,我在這裡列一下,不具體給例子了:
相對于這些增強已有功能的類,還有一些對常用功能進行補充的類,如durationformatutils ,這個類主要的作用就是處理時間的片斷,主要包括兩種方法:formatduration和formatperiod。如:
需要注意的是日期格式的小時必須用hh,而不能用hh 。
formatperiod方法用于計算兩個時間之間的片斷,然後轉化成相應的日期字元串類型,即能表示的最大機關
stopwatch 是一個計時器,具體舉個簡單的例子:
如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】
如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】
如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
轉載:http://www.cnblogs.com/java-class/p/4845962.html