Date是Java最早的日期工具,編程中經常通過它來獲取系統的當前時間。當然使用Date也很簡單,只要一個new關鍵字就能創建日期實例,就像以下代碼示範的那樣: 有了這個日期實例,再來調用getYear(獲取年份)、getMonth(獲取月份)、getDate(獲取日子)、getDay(獲取星期幾) ...
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開發筆記(序)章節目錄》