概要 不管你是處理財務交易還是計劃著下一步的行動,你都要知道怎樣在java中建立,使用和顯示日期。這需要你簡單的查閱一下相應類的API參考:一個日期可以創建3個相關類的對象。這篇文章告訴你你想要知道的內容。(3,000字) 作者:Robert Nielsen 翻譯:Cocia Lin
Java統計從1970年1月1日起的毫秒的數量表示日期。也就是說,例如,1970年1月2日,是在1月1日后的86,400,000毫秒。同樣的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date類使用long類型紀錄這些毫秒值.因為long是有符號整數,所以日期可以在1970年1月1日之前,也可以在這之后。Long類型表示的最大正值和最大負值可以輕松的表示290,000,000年的時間,這適合大多數人的時間要求。 Date 類 Date類可以在java.util包中找到,用一個long類型的值表示一個指定的時刻。它的一個有用的構造函數是Date(),它創建一個表示創建時刻的對象。getTime()方法返回Date對象的long值。在下面的程序中,我使用Date()構造函數創建一個表示程序運行時刻的對象,并且利用getTime()方法找到這個日期代表的毫秒數量:
import java.util.*;
public class Now { public static void main(String[] args) { Date now = new Date(); long nowLong = now.getTime(); System.out. } }
當我運行這個程序后,我得到972,568,255,150.快速確認一下這個數字,起碼在一個合理的范圍:它不到31年,這個數值相對1970年1月1日到我寫這篇文章的時間來說,是合理的。計算機是這個毫秒值表示時間,人們可不愿意說" 我將在996,321,998,34見到你。"幸運的是,Java提供了一個轉換Date對象到字符串的途徑,表示成傳統的形式。我們在下一節討論DateFormat類,它直觀的建立日期字符串。 DateFormat類 DateFormat類的一個目標是建立一個人們能夠識別的字符串。然而,因為語言的差別,不是所有的人希望看到嚴格的相同格式的日期。法國人更喜歡看到"25 decembre 2000,",但是美國人習慣看到"December 25,2000."所以一個DateFormat的實例創建以后,這個對象包含了日期的顯示格式的信息。假如使用用戶電腦區域設置缺省的格式,你可以象下面那樣,創建DateFormat對象,使用getDateInstance()方法:
public class NowString { public static void main(String[] args) { Date now = new Date(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(now); System.out.println("Today is " + s); } }
System.out.println("(Default) Today is " + s); System.out.println("(SHORT) Today is " + s1); System.out.println("(MEDIUM) Today is " + s2); System.out.println("(LONG) Today is " + s3); System.out.println("(FULL) Today is " + s4); } }
程序輸出如下:
(Default) Today is Nov 8, 2000 (SHORT) Today is 11/8/00 (MEDIUM) Today is Nov 8, 2000 (LONG) Today is November 8, 2000 (FULL) Today is Wednesday, November 8, 2000
同樣的程序,在我的電腦上使用缺省設置運行后,改變區域設置為瑞典,輸出如下:
(Default) Today is 2000-nov-08 (SHORT) Today is 2000-11-08 (MEDIUM) Today is 2000-nov-08 (LONG) Today is den 8 november 2000 (FULL) Today is den 8 november 2000
GregorianCalendar thisday = new GregorianCalendar();
一個輸出今天日期的例子程序,使用GregorianCalendar對象:
import java.util.*; import java.text.*;
class Today { public static void main(String[] args) { GregorianCalendar thisday = new GregorianCalendar(); Date d = thisday.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("Today is " + s); } }
public class World { public static void main(String[] args) { GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2); worldTour.add(GregorianCalendar.DATE, 80); Date d = worldTour.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("80 day trip will end " + s); } }
public class Mortgage { public static void main(String[] args) { GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18); mortgage.add(Calendar.YEAR, 15); Date d = mortgage.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("15 year mortgage amortized on " + s); } }
public class ThreeDates { public static void main(String[] args) { GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1); GregorianCalendar gc2 = gc1; GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1); //Three dates all equal to January 1, 2000
gc1.add(Calendar.YEAR, 1); file://gc1 and gc2 are changed
DateFormat df = DateFormat.getDateInstance();
Date d1 = gc1.getTime(); Date d2 = gc2.getTime(); Date d3 = gc3.getTime();
System.out.println("gc1 is " + s1); System.out.println("gc2 is " + s2); System.out.println("gc3 is " + s3); } }
程序運行后,gc1和gc2被變成2001年(因為兩個對象指向同一個Date,而Date已經被改變了)。對象gc3指向一個單獨的Date,它沒有被改變。 計算復習日期 在這節,你將看到一個依據現實世界的例子。這個具體的程序計算過去一個具體的日期。例如,你閱讀這篇文章,你想要記住一個印象深刻的知識點。假如你沒有照片一樣的記憶力,你就要定期的復習這些新資料,這將幫助你記住它。關于復習系統,Kurt Hanks 和 Gerreld L. Pulsipher在他們的< Five Secrets to Personal ProdUCtivity個人能力的5個秘密>中有討論,建議看過第一眼后馬上回顧一下,然后是1天后,1個星期后,1個月后,3個月后,1年后。我的這篇文章,你要馬上回顧一下,從現在算起,再就是明天,然后是1個星期,1個月,3個月,1年后。我們的程序將計算這些日期。 這個程序非常有用的,它將是PIM(Personal Information Manager個人信息治理器)的一個組成部分,并將確定復習時間。在下面的程序中,getDates()方法對一個返回日期數組(復習日期)的電子軟件很有用。另外,你可以返回單獨的一個日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().當時間范圍超出這個PIM的ReviewDates的計算范圍時ReviewDates類演示了怎樣計算時間段。現在,你可以輕易的修改它用來處理你需要的時間段,象圖書館借書,錄影帶租賃和抵押計算。首先,ReviewDates類顯示在下面:
import java.util.*; import java.text.*;
public class ReviewDates { private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear; final int dateArraySize = 6;
ReviewDates(GregorianCalendar gcDate) { int year = gcDate.get(GregorianCalendar.YEAR); int month = gcDate.get(GregorianCalendar.MONTH); int date = gcDate.get(GregorianCalendar.DATE);
firstDay = new GregorianCalendar(year, month, date); oneDay = new GregorianCalendar(year, month, date); oneWeek = new GregorianCalendar(year, month, date); oneMonth = new GregorianCalendar(year, month, date); oneQuarter = new GregorianCalendar(year, month, date); oneYear = new GregorianCalendar(year, month, date);
public void listDates() { DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); Date startDate = firstDay.getTime(); Date date1 = oneDay.getTime(); Date date2 = oneWeek.getTime(); Date date3 = oneMonth.getTime(); Date date4 = oneQuarter.getTime(); Date date5 = oneYear.getTime();