Date是Java最先的日期工具,編程中常常經過它來獲取系統的當前時間。固然使用Date也很簡單,只要一個new關鍵字就能建立日期實例,就像如下代碼示範的那樣:html
// 建立一個新的日期實例,默認保存的是系統時間 Date date = new Date();
有了這個日期實例,再來調用getYear(獲取年份)、getMonth(獲取月份)、getDate(獲取日子)、getDay(獲取星期幾)、getHours(獲取時鐘)、getMinutes(獲取分鐘)、getSeconds(獲取秒鐘)等方法,便可得到相應的時間單位數值。然而因爲Date早在Java誕生之初就一同問世,實際用的時候並不利索,每每須要程序員進行二次加工,才能獲得符合現實生活的時間數值。下面列舉幾個額外處理的例子,說明Date工具備哪些地方須要特別注意:
一、關於如何獲取日期實例中的年份
調用日期實例的getYear方法,結果獲得的年份數值並不是公元紀年,而是從1900年開始計數的年份。所以getYear方法返回的結果還要加上1900,兩者相加之和纔是真正的公元年份,因而經過Date獲取正常年份的代碼應該改爲下面這樣:java
// 獲取日期實例中的年份 int year = date.getYear() + 1900; System.out.println("year="+year);
二、關於如何獲取日期實例中的月份
雖然getMonth方法得到的是兩位月份,可是該方法的月份竟然是0開始計數的!也就是說,若是當前日期位於一月份,那麼getMonth返回的數值爲0而不爲1;依此類推,若是當前日期位於十二月份,則getMonth返回的數值爲11。很明顯早期的Java設計人員把十二個月看成一個整型數組了,既然一月份處於該數組的第一個位置,那麼它對應的下標就是0。如此一來,若要獲得現實生活中的月份序號,必須給getMonth的結果加一才行,修改後的代碼以下所示:程序員
// 獲取日期實例中的月份 int month = date.getMonth() + 1; System.out.println("month="+month);
三、關於如何獲取日期實例中的星期幾
按照大衆的廣泛認知,一個星期中的七天,理應從星期一開頭,以星期日結尾。但是日期實例的getDay方法卻從星期日開始,接下來纔是星期1、星期二等等;而且這七個星期數值依然被看成一個整型的星期數組,因此對於星期日來講,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開發筆記(序)章節目錄》工具