?? ?? ? 對(duì)于沒有使用過Calendar的程序員來說,再次處理日期時(shí)不妨使用Calendar而不僅僅是Date和SimpleDateFormat等類。這篇文章根據(jù)幾個(gè)使用日期的場(chǎng)景來說明如何使用Calendar等類。
?? ?? ? 在數(shù)據(jù)庫編程時(shí),我們通常將java日期字段選作Date型的(一般是java.sql.Date,繼承于java.util.Date,使用方法是類似的),當(dāng)然也可以存儲(chǔ)為字符串甚至是long型的time,但我們這里只討論date型的。如果存儲(chǔ)的時(shí)間是系統(tǒng)當(dāng)前時(shí)間,我們可以使用Date d = new Date();就得到想要的時(shí)間;以前我編程時(shí)也指定存儲(chǔ)日期的格式,但現(xiàn)在想來不是很有必要,完全可以在讀出數(shù)據(jù)時(shí)指定格式。另一種可選的方法是使用Calendar類,方法如下:
?? ?
?? ???? 如果要顯示數(shù)據(jù)庫中的日期,比如要在web頁面上顯示出諸如下面的日期字符串:“2007-06-21,21:18:03”,而輸入的參數(shù)即為對(duì)應(yīng)于數(shù)據(jù)庫的date型日期,方法如下:
但這里并沒有Calendar的事情,原因很簡單, Calendar并不能指定日期的格式,我們當(dāng)然可以通過拼串的形式得到想要的字符串,相比來說,SimpleDateFormat的使用更合適些。
?? ?? ? 好了,下面要說一個(gè)能顯示出Calendar用武之地的例子。假如一個(gè)web表單中有個(gè)出生年月日的選項(xiàng),該選項(xiàng)使用下拉框的方式選擇,即選項(xiàng)中有三個(gè)分別對(duì)應(yīng)于年月日的下拉框,下拉框的內(nèi)容是靜態(tài)的,比如年是“1930-2007”的option,月份是“1-12”的option,日是“1-31”的option。我們要寫一個(gè)方法,參數(shù)為從下拉框中得到的三個(gè)字符串參數(shù),返回結(jié)果為Date型日期以便存入數(shù)據(jù)庫中。下面是使用Calendar類的實(shí)現(xiàn)方法:
??? ??? 由于不能確定輸入?yún)?shù)是否為有效的數(shù)字,需要異常處理,這里只是簡單的返回 null。需要指出的是, Calendar中的月份是從“0”開始以“11”結(jié)束的,使用時(shí)要格外注意一下。 我們知道,每個(gè)月的天數(shù)是不一樣的,如果我們的month輸入的是“1”(就是二月),而day輸入的是“31”,Calendar(也包括Date類) 默認(rèn)的會(huì)將日期下延到下一個(gè)月而不報(bào)錯(cuò);如果我們不希望這樣處理,可以通過c.setLenient(false);使得嚴(yán)格要求日期有效,這樣上面的情況下函數(shù)就會(huì)拋出異常。
? ?? ?? Calendar還有一個(gè)應(yīng)用情況。假定我們從數(shù)據(jù)庫中得到date,希望能從date中得到具體的時(shí)間信息;可以使用date如下的相應(yīng)方法:

但就像你所看到的,java doc上很明白地depricated這些方法。可選擇的方法是使用Calendar類。例子如下:?? ?
??? ??? 如上便是我基本的使用 Calendar類的情況,如果有不正確的地方歡迎指正。關(guān)于 Calendar的更詳細(xì)的使用方法,可以參考java doc。
?? ?? ? 在數(shù)據(jù)庫編程時(shí),我們通常將java日期字段選作Date型的(一般是java.sql.Date,繼承于java.util.Date,使用方法是類似的),當(dāng)然也可以存儲(chǔ)為字符串甚至是long型的time,但我們這里只討論date型的。如果存儲(chǔ)的時(shí)間是系統(tǒng)當(dāng)前時(shí)間,我們可以使用Date d = new Date();就得到想要的時(shí)間;以前我編程時(shí)也指定存儲(chǔ)日期的格式,但現(xiàn)在想來不是很有必要,完全可以在讀出數(shù)據(jù)時(shí)指定格式。另一種可選的方法是使用Calendar類,方法如下:
????public?Date?now(){
????????Calendar?c?=?Calendar.getInstance();
????????return?c.getTime();
????}
????????Calendar?c?=?Calendar.getInstance();
????????return?c.getTime();
????}
?? ?
?? ???? 如果要顯示數(shù)據(jù)庫中的日期,比如要在web頁面上顯示出諸如下面的日期字符串:“2007-06-21,21:18:03”,而輸入的參數(shù)即為對(duì)應(yīng)于數(shù)據(jù)庫的date型日期,方法如下:
????public?String?time(Date?date){
????????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd,HH:mm:ss");
??????String?s?=?sdf.format(date);
????????return?s;
????}
????????SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd,HH:mm:ss");
??????String?s?=?sdf.format(date);
????????return?s;
????}
但這里并沒有Calendar的事情,原因很簡單, Calendar并不能指定日期的格式,我們當(dāng)然可以通過拼串的形式得到想要的字符串,相比來說,SimpleDateFormat的使用更合適些。
?? ?? ? 好了,下面要說一個(gè)能顯示出Calendar用武之地的例子。假如一個(gè)web表單中有個(gè)出生年月日的選項(xiàng),該選項(xiàng)使用下拉框的方式選擇,即選項(xiàng)中有三個(gè)分別對(duì)應(yīng)于年月日的下拉框,下拉框的內(nèi)容是靜態(tài)的,比如年是“1930-2007”的option,月份是“1-12”的option,日是“1-31”的option。我們要寫一個(gè)方法,參數(shù)為從下拉框中得到的三個(gè)字符串參數(shù),返回結(jié)果為Date型日期以便存入數(shù)據(jù)庫中。下面是使用Calendar類的實(shí)現(xiàn)方法:
????public?Date?getTime(String?year,String?month,String?day){
????????Calendar?c?=?Calendar.getInstance();
????????c.setLenient(false);
????????try{
????????????c.set(Calendar.YEAR,?Integer.parseInt(year));
????????????c.set(Calendar.MONTH,?(Integer.parseInt(month)-1));
????????????c.set(Calendar.DATE,?Integer.parseInt(day));
????????????Date?d?=?c.getTime();
????????????return?d;
????????}catch(Exception?e){
????????????????//????????????
????????}
????????return?null;
????}
????????Calendar?c?=?Calendar.getInstance();
????????c.setLenient(false);
????????try{
????????????c.set(Calendar.YEAR,?Integer.parseInt(year));
????????????c.set(Calendar.MONTH,?(Integer.parseInt(month)-1));
????????????c.set(Calendar.DATE,?Integer.parseInt(day));
????????????Date?d?=?c.getTime();
????????????return?d;
????????}catch(Exception?e){
????????????????//????????????
????????}
????????return?null;
????}
??? ??? 由于不能確定輸入?yún)?shù)是否為有效的數(shù)字,需要異常處理,這里只是簡單的返回 null。需要指出的是, Calendar中的月份是從“0”開始以“11”結(jié)束的,使用時(shí)要格外注意一下。 我們知道,每個(gè)月的天數(shù)是不一樣的,如果我們的month輸入的是“1”(就是二月),而day輸入的是“31”,Calendar(也包括Date類) 默認(rèn)的會(huì)將日期下延到下一個(gè)月而不報(bào)錯(cuò);如果我們不希望這樣處理,可以通過c.setLenient(false);使得嚴(yán)格要求日期有效,這樣上面的情況下函數(shù)就會(huì)拋出異常。
? ?? ?? Calendar還有一個(gè)應(yīng)用情況。假定我們從數(shù)據(jù)庫中得到date,希望能從date中得到具體的時(shí)間信息;可以使用date如下的相應(yīng)方法:

但就像你所看到的,java doc上很明白地depricated這些方法。可選擇的方法是使用Calendar類。例子如下:?? ?
????public?void?getDetailsOfTime(Date?date){
????????Calendar?c?=?Calendar.getInstance();
????????c.setTime(date);
????????int?y?=?c.get(Calendar.YEAR);
????????int?m?=?c.get(Calendar.MONTH);
????????int?d?=?c.get(Calendar.DATE);
????????int?h?=?c.get(Calendar.HOUR);
????????int?mi?=?c.get(Calendar.MINUTE);
????????int?s?=?c.get(Calendar.SECOND);
????????System.out.printf("year=%d,month=%d,date=%d,hour=%d,mimute=%d,second=%d",y,m,d,h,mi,s);
????}
????????Calendar?c?=?Calendar.getInstance();
????????c.setTime(date);
????????int?y?=?c.get(Calendar.YEAR);
????????int?m?=?c.get(Calendar.MONTH);
????????int?d?=?c.get(Calendar.DATE);
????????int?h?=?c.get(Calendar.HOUR);
????????int?mi?=?c.get(Calendar.MINUTE);
????????int?s?=?c.get(Calendar.SECOND);
????????System.out.printf("year=%d,month=%d,date=%d,hour=%d,mimute=%d,second=%d",y,m,d,h,mi,s);
????}
??? ??? 如上便是我基本的使用 Calendar類的情況,如果有不正確的地方歡迎指正。關(guān)于 Calendar的更詳細(xì)的使用方法,可以參考java doc。