Java 語言提供了許多處理日期的工具。其中一些工具在其他語言中使用起來更困難一些。盡管如此,Java 語言提供的那些工具幾乎可以做創建日期方面的任何事情,并完全根據您想要的格式對這些日期進行格式化。
當 Java 語言出錯時,它會包含一個叫做 Date 的類,這個類對創建和處理日期很有幫助。不幸的是,這個類在支持同步方面表現不是很好,所以 Sun 添加了兩個幫助改善這種情況的類:
· Calendar
· DateFormat
首先討論一下 Calendar,稍后再討論 DateFormat。
創建 Date 仍然比較容易:
Date aDate = new Date(System.currentTimeMillis());
或者可以使用以下代碼:
Date aDate = new Date();
這將為我們提供一個表示當前確切日期和時間的 Date,并以當前地區 格式顯示。國際化已經超出了本教程的范圍,只要知道獲得的 Date 與本地機器的地區時間一致即可。
既然有了一個實例,為什么不能處理它呢?坦率地說,它太小了。我們可以將一個 Date 與另一個日期進行比較,查看前一個日期是在后一個日期的 before() 還是 after()。還可以通過調用 setTime() 將日期重新設置為一個新的時間瞬間,setTime() 帶有一個 long 參數,該參數表示從 1970 年 1 月 1 日午夜起至現在過去了多少毫秒,這也正是 System.currentTimeMillis() 返回的值。在此之外,我們受到了限制。
日歷
現在,Date 給人們帶來的混亂要多于它為人們帶來的有用性,因為大部分日期處理行為都受到人們的抨擊。人們習慣于獲得并設置部分 Date(比如,年、月,等等)。現在,必須同時處理 Date 和 Calendar 才能設置部分 Date。但是一旦有了 Date 實例,就可以使用 Calendar 獲得并設置部分 Date。例如:
Date aDate = new Date(System.currentTimeMillis());
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(aDate);
在這里,我們創建了一個 GregorianCalendar,并將它的時間設置為以前創建的 Date。通過在 Calendar 上調用不同的方法,也能做到這一點:
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
通過 Calendar,我們現在可以訪問和操作 Date 的組件。獲得并設置部分 Date 也成為一個簡單的過程。只需要在 Calendar 上調用適當的 getter 和 setter 即可,如下所示:
calendar.set(Calendar.MONTH, Calendar.JULY);
calendar.set(Calendar.DAY_OF_MONTH, 15);
calendar.set(Calendar.YEAR, 1978);
calendar.set(Calendar.HOUR, 2);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 37);
System.out.println(calendar.getTime());
這將輸出 1987 年 7 月 15 日上午 2 點 15 分 37 秒的格式化后的輸出字符串。(在 Calendar 上也有一些輔助方法,允許同時設置一些或幾乎所有的組件。)這里調用的是 set(),它帶有兩個參數:
· 想要設置的 Date 的 field(或組件)。
· 該字段的值。
我們可以用 Calendar 類中指定的常數來引用這些字段。在某些情況下,同一字段會有一個以上的名稱,比如 Calendar.DAY_OF_MONTH,還可以用 Calendar.DATE 來引用它。除了可能是 Calendar.MONTH 的值和 Calendar.DATE 的值之外,其他的值都很簡單。在 Java 語言的日期中,月份是基于 0 的(也就是說,1 月是 0),這使得使用指定的常數來設置月份值成為一種明智之舉,但也使得正確地顯示日期成為令人沮喪的事。小時的數值是從 0 到 24。
一旦有一個建立好的 Date,就可以提取其中的一部分。
System.out.println("The YEAR is: " + calendar.get(Calendar.YEAR));
System.out.println("The MONTH is: " + calendar.get(Calendar.MONTH));
System.out.println("The DAY is: " + calendar.get(Calendar.DATE));
System.out.println("The HOUR is: " + calendar.get(Calendar.HOUR));
System.out.println("The MINUTE is: " + calendar.get(Calendar.MINUTE));
System.out.println("The SECOND is: " + calendar.get(Calendar.SECOND));
System.out.println("The AM_PM indicator is: " + calendar.get(Calendar.AM_PM));
內置日期的格式化
通常可以使用 Date 格式化日期。現在,必須使用其他幾個類:
· DateFormat
· SimpleDateFormat
· DateFormatSymbols
在這里,我們并不想介紹日期格式化所涉及的所有復雜事物。您可以自己去研究這些類。但我們仍將介紹一些使用這些工具的基礎知識。
DateFormat 類允許我們創建特定于場所的格式化程序,如下所示:
DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT);
Date aDate = new Date();
String formattedDate = dateFormatter.format(today);
該代碼使用用于這種場所的默認格式創建了一個格式化的日期字符串。在我的機器上,這個日期字符串看起來是這樣的:
Nov 11, 2005
這是默認樣式,但所有的樣式都適用于我們。我們可以使用任何預定義的樣式。還可以調用 DateFormat.getTimeInstance() 來格式化時間,或者調用 DateFormat.getDateTimeInstance() 將日期和時間一起格式化。以下是各種樣式的輸出,都適用于美國地區:
樣式 日期 時間 日期/時間
DEFAULT Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM
SHORT 11/11/05 7:44 PM 11/11/05 7:44 PM
MEDIUM Nov 11, 2005 7:44:56 PM Nov 11, 2005 7:44:56 PM
LONG November 11, 2005 7:44:56 PM EST November 11, 2005 7:44:56 PM EST
FULL Thursday, November 11, 2005 7:44:56 PM EST Thursday, November 11, 2005 7:44:56 PM EST
定制格式化:
這些預定義的格式在大多數情況下表現良好,但是您也可以使用 SimpleDateFormat 定義自己的格式。使用 SimpleDateFormat 非常簡單:
· 使用一個格式模式字符串(和一個地區,如果您希望的話)來實例化 SimpleDateFormat。
· 使用 Date 在其上調用 format()。
結果是一個格式化了的日期字符串。以下是一個例子:
Date aDate = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
String formattedDate = formatter.format(today);
System.out.println(formattedDate);
在運行該代碼時,將獲得以下類似結果(當然,它將影響運行代碼時的當前日期):
11/05/2005
在上述例子中,用引號括起來的字符串遵循了日期格式化模式的模式語法規則。Java.sun.com 中有一些那些規則的很好概括(請參閱 參考資料)。以下是一些有用的經驗法則:您可以指定日期和時間的模式。
· 一些模式語法并不是由直覺得到的(例如,mm 定義了一個兩位數的分鐘模式;要獲得簡寫的月份,可以使用 MM)。
· 通過將文本文字放入單括號中可以在模式中包含這
久久不醉