天天看點

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

<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種之多,基本能滿足項目時間格式化的要求,當然也可以自己自定義格式:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

是以上面的也可以這樣寫:

   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,才能修改,如:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

在這方面commons-lang的确做得很完善,現在可以這樣寫:

eg: 

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

     方法名也非常的直覺,使用也更加友善了。但有一些方法不是很好了解,就像下面這個函數:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

   當然在dateutils也有一些一看就知道是做什麼的函數,我在這裡列一下,不具體給例子了:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

  相對于這些增強已有功能的類,還有一些對常用功能進行補充的類,如durationformatutils ,這個類主要的作用就是處理時間的片斷,主要包括兩種方法:formatduration和formatperiod。如:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

     需要注意的是日期格式的小時必須用hh,而不能用hh 。 

     formatperiod方法用于計算兩個時間之間的片斷,然後轉化成相應的日期字元串類型,即能表示的最大機關

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

    stopwatch 是一個計時器,具體舉個簡單的例子:

讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】
讓時間處理簡單化 【第三方擴充類庫org.apache.commons.lang.time】

如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】 

如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】 

如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】 

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。 

轉載:http://www.cnblogs.com/java-class/p/4845962.html