JSP中日期的用法
在開發有關日曆的應用程式時,不規則的每月日期數、每周天數和周末的計算一直是個很費腦筋的問題。結果,日期和時間的編程經常令程式員新手畏縮不前。本文將示範在JSP應用程式中日期的用法,為讀者完成某些常見任務提供方便的參考。
目的
應用程式範例的目的是:
通過HTML表單把日期參數提交某個JSP頁來處理。
接收日期參數並建立Calendar對象。
採用Calendar對象找出提交的日期是一周的第幾天以及選中月份裡有多少工作日。
用使用者易於閱讀的顯示格式對日期格式化。
環境
樣本程式碼在Java Web伺服器上接受測試,該伺服器配置了JDK 1.31。樣本寫得很標準,在Tomcat或者其他JSP Web伺服器(JDK 1.2或者以後版本)上啟動並執行效果幾乎完全一樣。
通過表單把日期傳遞給JSP頁
Date(日期)參數是使用者從3欄下拉式清單中選出來的。使用者提交表單之後,這些參數即被傳送給處理頁面。
在進行日曆編程時不要忘了匯入java.util.Calendar:
〈%@ page import="java.util.Calendar" %〉
處理頁面的第1個任務是接收以下日期參數值:Date、Month和Year。
int curDate = 1;
if(request.getParameter("curDate") != null)
{
curDate = Integer.parseInt(request.getParameter("curDate"));
}
注意頁面參數被轉換為int類型,馬上我們就知道為什麼要這麼做了。
Calendar對象
我們的目標是建立和設定一個Calendar對象,用它進行日期計算。為此,我們首先需要執行個體化一個Calendar對象。
Calendar cal = Calendar.getInstance();
Calendar.getInstance()返回一個代表當前日期和時間的Calendar對象。
cal.clear();
cal.set(curYear, curMonth , curDate);
clear()方法清空Calendar,這樣我們才可能給該對象分配我們自己的日期值並為將來的計算做好準備。注意這些參數的順序:首先是年,最後是日期。
從Calendar擷取資訊
以下是一組Calendar欄位:
日期
DATE, DAY_OF_MONTH, DAY_OF_WEEK, DAY_OF_YEAR
時間
HOUR_OF_DAY, MINUTE, MILLISECOND, SECOND
周
WEEK_OF_MONTH, WEEK_OF_YEAR
年
YEAR
以上這些欄位都可以通過Calendar的get()方法進行訪問,結果返回一個整數。以下程式碼範例顯示了以上過程。
一周內的日期
int dayOfWeek = cal.get(cal.DAY_OF_WEEK);
out.print("〈br〉Day of Week: " + dayOfWeek + " 〈br〉");
一月內的日期
int dayOfMonth = cal.get(cal.DAY_OF_MONTH);
out.print("〈br〉Day of Month: " + dayOfMonth + " 〈br〉");
定位特定的日期
為了找出一周內特定的某一天就必須訪問DAY_OF_WEEK欄位。該欄位包含了範圍從1到7的整數值,1代表星期一,2代表星期二,其餘以次類推。
int dayOfWeek = cal.get(cal.DAY_OF_WEEK);
這裡有個向使用者顯示日期的好方法,那就是聲明一個包含一周內天數的數組。然後就可以很方便地顯示各個日期了。只要採用DAY_OF_WEEK整數訪問數組內的當前日期即可。
String[] weekdays = new String[]
{“”, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
〈%=weekdays[cal.get(cal.DAY_OF_WEEK)]%〉
注意該數組的第1個元素為空白。這是因為DAY_OF_WEEK欄位值的範圍是從1到7,而數組元素的引用範圍則是從0到6。在數組開頭加一個空元素就可以保證DAY_OF_WEEK欄位的值和數組引用相匹配了。
找出周末
為了找出某天是否正好是星期天或者星期六可以編寫以下代碼:
int day = cal.get(cal.DAY_OF_WEEK);
if(day == 6 || day == 7)
{
//執行與周末有關的操作
}
工作日
現在我們需要計算出某個月內的工作日天數。使用者輸入日期(參看index.jsp)之後把參數發送給處理頁面(參看display.jsp)。在處理頁面上,我們把Calendar對象設定為該月的第1天。
cal.clear();
cal.set(curYear, curMonth , 1);
int maxDays = cal.getActualMaximum(cal.DATE);
out.print("〈br〉Number of days in month: " + maxDays + "〈br〉");
我們還需要知道某個月內到底有多少天。getActualMaximum()方法返回一個整數值,該值就包含了每個月內的最多天數:2月是28天,3月是31天等等。在閏年的話2月的天數返回 29天。
一旦我們得到了每個月內的最多天數,我們就可以很方便地迴圈每月天數判斷是否是周末或者工作一日。我們用add()方法給Calendar遞增1,如程式清單A所示。
用SimpleDateFormat向使用者顯示日期
SimpleDateFormat處理顯示日期的最常用需求,它可以用來把日期轉換為特定的儲存格式。你可以採用以下的匯入指示符:
〈%@ page import="java.text.SimpleDateFormat" %〉
以下的代碼給使用者顯示日期:
SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy");
out.print("〈br〉" + formatter.format(cal.getTime()) );
SimpleDateFormat對象接受一個字串作為其物件建構器,該字串參數包含了使用者希望採用的顯示格式。這個格式字串可以包含額外的格式字串,比如空格(“ ”)、反斜線( “/”)和破折號(“-”)。
表A列出了所有有效(常用的)顯示格式。
表A
格式
樣本
“dd/MMM/yyyy”
06/Mar/1974
"dd-MM-yyyy"
06-03-1974
"dd MMMMMMMMM yyyy"
06 March 1974
"EEEEEEEEE, MMMMMMMMM dd, yyyy"
Wednesday, March 06, 1974
有效SimpleDateFormat顯示格式
表B是SimpleDateFormat參數的縮減語表。
表B
y
year
M
month in year
d
day in month
D
day in year
w
week in year
W
week in month
E
day in week
SimpleDateFormat參數
重用代碼--FormatTitle
在同一頁面上實施多種格式轉換有個簡單方法:在Declaration元素中是聲明FormatTitle方法,它接受兩個參數,一個引用Calendar對象,另一個返回格式。
〈%!
public String FormatTitle(Calendar fCal, String format)
{
SimpleDateFormat formatter = new SimpleDateFormat(format);
return (formatter.format(fCal.getTime() ));
}
%〉
為了顯示日期,我們調用FormatTitle()並為其傳遞Calendar和格式字串參數。
〈%=FormatTitle(cal, “dd-MMM-yyyy”)%〉
小結
學完以上的簡單教程,相信你現在應該能用Calendar和SimpleDateFormat對象操作和顯示日期了。
add()和set()方法可以輕鬆配置Calendar,促使你可以為商務應用程式遍曆月份和年數。FormatTitle方法可以大大簡化給使用者顯示日期的任務,同樣的,它還簡化了把日期轉換為字串的操作,而這一操作主要應用在資料庫和XML文檔的資料儲存方面。