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