在开发有关日历的应用程序时不规则的每月日期数每周天数和周末的计算一直是个很费脑筋的问题结果日期和时间的编程经常令程序员新手畏缩不前本文将演示在JSP应用程序中日期的用法为读者完成某些常见任务提供方便的参考
目的
示例应用程序的目的是
通过HTML表单把日期参数提交某个JSP页来处理
接收日期参数并创建Calendar对象
采用Calendar对象找出提交的日期是一周的第几天以及选中月份里有多少工作日
用用户易于阅读的显示格式对日期格式化
环境
示例程序代码在Java Web服务器上接受测试该服务器配置了JDK 示例写得很标准在Tomcat或者其他JSP Web服务器(JDK 或者以后版本)上运行的效果几乎完全一样
通过表单把日期传递给JSP页
Date(日期)参数是用户从栏下拉列表中选出来的用户提交表单之后这些参数即被传送给处理页面
在进行日历编程时不要忘了导入javautilCalendar
〈%@ page import="javautilCalendar" %〉
处理页面的第个任务是接收以下日期参数值DateMonth和Year
int curDate = ;
if(requestgetParameter("curDate") != null)
{
curDate = IntegerparseInt(requestgetParameter("curDate"));
}
注意页面参数被转换为int类型马上我们就知道为什么要这么做了
Calendar对象
我们的目标是创建和设置一个Calendar对象用它进行日期计算为此我们首先需要实例化一个Calendar对象
Calendar cal = CalendargetInstance();
CalendargetInstance()返回一个代表当前日期和时间的Calendar对象
calclear();
calset(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 = calget(calDAY_OF_WEEK);
outprint("〈br〉Day of Week: " + dayOfWeek + " 〈br〉");
一月内的日期
int dayOfMonth = calget(calDAY_OF_MONTH);
outprint("〈br〉Day of Month: " + dayOfMonth + " 〈br〉");
定位特定的日期
为了找出一周内特定的某一天就必须访问DAY_OF_WEEK字段该字段包含了范围从到的整数值代表星期一代表星期二其余以次类推
int dayOfWeek = calget(calDAY_OF_WEEK);
这里有个向用户显示日期的好方法那就是声明一个包含一周内天数的数组然后就可以很方便地显示各个日期了只要采用DAY_OF_WEEK整数访问数组内的当前日期即可
String[] weekdays = new String[]
{“” "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday"};
〈%=weekdays[calget(calDAY_OF_WEEK)]%〉
注意该数组的第个元素为空这是因为DAY_OF_WEEK字段值的范围是从到而数组元素的引用范围则是从到在数组开头加一个空元素就可以保证DAY_OF_WEEK字段的值和数组引用相匹配了
找出周末
为了找出某天是否正好是星期天或者星期六可以编写以下代码
int day = calget(calDAY_OF_WEEK);
if(day == || day == )
{
//执行与周末有关的操作
}
工作日
现在我们需要计算出某个月内的工作日天数用户输入日期(参看indexjsp)之后把参数发送给处理页面(参看displayjsp)在处理页面上我们把Calendar对象设置为该月的第天
calclear();
calset(curYear curMonth );
int maxDays = calgetActualMaximum(calDATE);
outprint("〈br〉Number of days in month: " + maxDays + "〈br〉");
我们还需要知道某个月内到底有多少天getActualMaximum()方法返回一个整数值该值就包含了每个月内的最多天数月是天月是天等等在闰年的话月的天数返回 天
一旦我们得到了每个月内的最多天数我们就可以很方便地循环每月天数判断是否是周末或者工作一日我们用add()方法给Calendar递增如程序清单A所示
用SimpleDateFormat向用户显示日期
SimpleDateFormat处理显示日期的最常用需求它可以用来把日期转换为特定的保存格式你可以采用以下的导入指示符
〈%@ page import="javatextSimpleDateFormat" %〉
以下的代码给用户显示日期
SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy");
outprint("〈br〉" + formatterformat(calgetTime()) );
SimpleDateFormat对象接受一个字符串作为其对象构造器该字符串参数包含了用户希望采用的显示格式这个格式字符串可以包含额外的格式字符串比如空格(“ ”)反斜线( “/”)和破折号(“”)
表A列出了所有有效的(常用的)显示格式
表A
格式
示例
“dd/MMM/yyyy”
/Mar/
"ddMMyyyy"
"dd MMMMMMMMM yyyy"
March
"EEEEEEEEE MMMMMMMMM dd yyyy"
Wednesday March
有效的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 (formatterformat(fCalgetTime() ));
}
%〉
为了显示日期我们调用FormatTitle()并为其传递Calendar和格式字符串参数
〈%=FormatTitle(cal “ddMMMyyyy”)%〉
小结
学完以上的简单教程相信你现在应该能用Calendar和SimpleDateFormat对象操作和显示日期了
add()和set()方法可以轻松配置Calendar促使你可以为商业应用程序遍历月份和年数FormatTitle方法可以大大简化给用户显示日期的任务同样的它还简化了把日期转换为字符串的操作而这一操作主要应用在数据库和XML文档的数据保存方面