1. 程式人生 > >Java開發筆記(三十九)日期工具Date

Java開發筆記(三十九)日期工具Date

Date是Java最早的日期工具,程式設計中經常通過它來獲取系統的當前時間。當然使用Date也很簡單,只要一個new關鍵字就能建立日期例項,就像以下程式碼示範的那樣:

		// 建立一個新的日期例項,預設儲存的是系統時間
		Date date = new Date();

 

有了這個日期例項,再來呼叫getYear(獲取年份)、getMonth(獲取月份)、getDate(獲取日子)、getDay(獲取星期幾)、getHours(獲取時鐘)、getMinutes(獲取分鐘)、getSeconds(獲取秒鐘)等方法,即可獲得相應的時間單位數值。然而由於Date早在Java誕生之初就一同問世,實際用的時候並不利索,往往需要程式設計師進行二次加工,才能得到符合現實生活的時間數值。下面列舉幾個額外處理的例子,說明Date工具有哪些地方需要特別注意:
1、關於如何獲取日期例項中的年份


呼叫日期例項的getYear方法,結果得到的年份數值並非公元紀年,而是從1900年開始計數的年份。因此getYear方法返回的結果還要加上1900,二者相加之和才是真正的公元年份,於是通過Date獲取正常年份的程式碼應該改成下面這樣:

		// 獲取日期例項中的年份
		int year = date.getYear() + 1900;
		System.out.println("year="+year);

 

2、關於如何獲取日期例項中的月份
雖然getMonth方法獲得的是兩位月份,但是該方法的月份居然是0開始計數的!也就是說,如果當前日期位於一月份,那麼getMonth返回的數值為0而不為1;依此類推,如果當前日期位於十二月份,則getMonth返回的數值為11。很明顯早期的Java設計人員把十二個月當作一個整型陣列了,既然一月份處於該陣列的第一個位置,那麼它對應的下標就是0。如此一來,若要得到現實生活中的月份序號,必須給getMonth的結果加一才行,修改後的程式碼如下所示:

		// 獲取日期例項中的月份
		int month = date.getMonth() + 1;
		System.out.println("month="+month);

 

3、關於如何獲取日期例項中的星期幾
按照大眾的普遍認知,一個星期中的七天,理應從星期一開頭,以星期日結尾。可是日期例項的getDay方法卻從星期日開始,接下來才是星期一、星期二等等;並且這七個星期數值依然被當作一個整型的星期陣列,所以對於星期日來說,getDay返回的是0,對於星期一來說,getDay返回的是1。故而也有必要修正getDay的結果,將星期日對應的數值改為7,處理之後的獲取程式碼示例如下:

		// 獲取日期例項中的星期幾
		int dayWeek = date.getDay();
		dayWeek = (dayWeek==0) ? 7 : dayWeek; // 將星期日對應的數值改為7
		System.out.println("dayWeek="+dayWeek);

 

經過以上的數番折騰,真教人倒吸一口冷氣,原本是小學生都知道的常識,未曾想被Date這個日期工具搞得如此詰屈聱牙,可見即便是設計一種程式語言,也得調研一下大眾的尋常認知,切不可閉門造車使人徒增煩惱。幸好通過Date獲取其餘的時間單位比較常規,像getDate方法返回的就是當月的日子,getHours、getMinutes、getSeconds這三個方法分別返回當前的時鐘、分鐘、秒鐘,這些時間數值的獲取程式碼如下所示:

		// 獲取日期例項中的日子
		int dateInt = date.getDate();
		System.out.println("dateInt="+dateInt);
		// 獲取日期例項中的時鐘
		int hour = date.getHours();
		System.out.println("hour="+hour);
		// 獲取日期例項中的分鐘
		int minute = date.getMinutes();
		System.out.println("minute="+minute);
		// 獲取日期例項中的秒鐘
		int second = date.getSeconds();
		System.out.println("second="+second);
		// 獲取日期例項中的時間總數(單位毫秒)
		long time = date.getTime();
		System.out.println("time="+time);

 

除了上述的一系列get***方法可用來獲取各種時間單位數值,Date工具還提供了相對應的set***方法,用於設定日期例項的某個時間數值。下面是設定時間單位數值的相關方法說明:
setYear:設定日期例項中的年份。
setMonth:設定日期例項中的月份。
setDate:設定日期例項中的日子。
setHours:設定日期例項中的時鐘。
setMinutes:設定日期例項中的分鐘。
setSeconds:設定日期例項中的秒鐘。
setTime:設定日期例項中的時間總數(單位毫秒)。
時間看似複雜,其實它是一種特殊的數字,只不過被人為換算成年月日、時分秒的各種單位組合。既然數字有大小之分,時間也存在先後順序,當然我們不說哪個時間較大、哪個時間較小,而說哪個時間較早、哪個時間較晚。猶記得數值包裝型別提供了equals方法比較兩個數字是否相等,Date型別同樣提供了equals方法比較兩個時間是否相等。與時間相等比起來,大家更關心兩個時間的早晚先後關係,所以Date型別又提供了before方法,用來檢查A時間是否在B時間之前;也提供了after方法,用來檢查A時間是否在B時間之後。如此一來,便有了三種時間校驗方法:相等、更早和更晚,顯然這三個方法都是檢查兩個時間的先後關係,不妨將它們統一起來,通過方法的返回值來判斷兩個時間的早晚次序。於是就有了Date型別的compareTo方法,該方法返回-1的時候,表示A時間較早;返回0的時候,表示兩個時間相等;返回1的時候,表示B時間較早。最後給出上述時間判斷的演示程式碼:

	// 比較兩個日期時間的先後關係
	private static void compareDate() {
		Date dateOld = new Date();
		Date dateNew = new Date();
		// 設定dateNew的時間總數(單位毫秒)。此處表示給當前時間增加一毫秒
		dateNew.setTime(dateNew.getTime()+1);
		// 比較兩個時間是否相等
		boolean equals = dateOld.equals(dateNew);
		System.out.println("equals="+equals);
		// 比較A時間是否在B時間之前
		boolean before = dateOld.before(dateNew);
		System.out.println("before="+before);
		// 比較A時間是否在B時間之後
		boolean after = dateOld.after(dateNew);
		System.out.println("after="+after);
		// 比較A時間與B時間的先後關係。返回-1表示A時間較早,返回0表示兩個時間相等,返回1表示B時間較早
		int compareResult = dateOld.compareTo(dateNew);
		System.out.println("compareResult="+compareResult);
	}

  

更多Java技術文章參見《Java開發筆記(序)章節目錄