Java 操作日期/時間,往往會涉及到Calendar,Date,DateFormat這些類。
最近決定把這些內容系統的整理一下,這樣以後使用的時候,會更得心應手。本章的內容是主要講解“Java時間架構”以及“類Calendar”。
在學習Calendar類時,我們先對它有個整體認識,心中建立一個架構,然後再通過樣本學習如何使用它。
Java 時間架構圖
Java 的Calendar, Date和DateFormat的關係圖如下:
說明:
(01) milliseconds 表示毫秒。
milliseconds = “實際時間” - “1970-01-01 00:00:00”。Calendar 和 Date依賴於 milliseconds,從而表示時間。
(02) Calendar表示日期/時間。
它是一個抽象類別,依賴於milliseconds。GregorianCalendar是Calendar的子類,通常我們通過Calendar.getInstance() 擷取Calendar執行個體時,實際上返回的是 GregorianCalendar 對象。
Calendar和Locale關聯,而Locale代表地區;Locale的值不同時,Calendar的日期/時間也不同。
Calendar和TimeZone關聯,而TimeZone代表時區;不同的時區,Calendar的日期/時間也不同。
(03) Date 表示日期/時間。
它也依賴於 milliseconds實現。
在 JDK 1.1 之前,通常是通過Data操作“年月日時分秒”。不過,由於Date的相關 API 不易於實現國際化。從 JDK 1.1 開始,應該使用 Calendar 類來操作“年月日時分秒”,同時可以通過 DateFormat 類來格式化和解析日期文字。Date 中的相應方法已廢棄。
(04) DateFormat是格式化/解析“日期/時間”的工具類。
它是Date的格式化工具,它能協助我們格式化Date,進而將Date轉換成我們想要的String字串供我們使用。
它是一個抽象類別。通常,我們通過getInstance(), getDateInstance()和getDateTimeInstance() 等擷取DateFormat執行個體時;實際上是返回的SimpleDateFormat對象。
Calendar 介紹
Calendar 定義
publicabstractclass Calendar implements Serializable, Cloneable, Comparable<Calendar> {}
Calendar 是一個抽象類別。
它的實現,採用了設計模式中的Factory 方法。表現在:當我們擷取Calendar執行個體時,Calendar會根據傳入的參數來返回相應的Calendar對象。擷取Calendar執行個體,有以下兩種方式: 1) 當我們通過 Calendar.getInstance() 擷取日曆時,預設的是返回的一個GregorianCalendar對象。 GregorianCalendar是Calendar的一個實作類別,它提供了世界上大多數省/地區使用的標準日曆系統。 2) 當我們通過 Calendar.getInstance(TimeZone timezone, Locale locale) 或 Calendar.getInstance(TimeZone timezone) 或 Calendar.getInstance(Locale locale)擷取日曆時,是返回“對應時區(zone) 或 地區(local)等所使用的日曆”。 例如,若是日本,則返回JapaneseImperialCalendar對象。
參考如下代碼:
public static Calendar getInstance(){ // 調用createCalendar()建立日曆 Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault()); cal.sharedZone = true; return cal;} public static Calendar getInstance(TimeZone zone){ // 調用createCalendar()建立日曆 return createCalendar(zone, Locale.getDefault());} public static Calendar getInstance(Locale aLocale) { // 調用createCalendar()建立日曆 Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale); cal.sharedZone = true; return cal;} public static Calendar getInstance(TimeZone zone, Locale aLocale){ // 調用createCalendar()建立日曆 return createCalendar(zone, aLocale);} private static Calendar createCalendar(TimeZone zone, Locale aLocale){ // (01) 若地區是“th”,則返回BuddhistCalendar對象 // (02) 若地區是“JP”,則返回JapaneseImperialCalendar對象 if ("th".equals(aLocale.getLanguage()) && ("TH".equals(aLocale.getCountry()))) { return new sun.util.BuddhistCalendar(zone, aLocale); } else if ("JP".equals(aLocale.getVariant()) && "JP".equals(aLocale.getCountry()) && "ja".equals(aLocale.getLanguage())) { return new JapaneseImperialCalendar(zone, aLocale); } // (03) 否則,返回GregorianCalendar對象 return new GregorianCalendar(zone, aLocale); }
當我們擷取Calendar執行個體之後,就可以通過Calendar提供的一些列方法來操作日曆。