可以使用Date函数的getDay取得,返回的值从0到6,0表示星期一,1表示星期二,2表示星期三,其余依此类推。代码如下(假设要处理的时间为2008年3月):
n1str=new Date(2008,3,1); firstday=n1str.getDay();
有了月总天数和该月第一天是星期几这两个已知条件,就可以解决表格所需行数问题:(当前月天数+第一天是星期几的数值)除以七。表格函数需要整数,因此,我们使用Math.ceil来处理:
tr_str=Math.ceil((m_days[mnow] + firstday)/7);
表格中的tr标签实际上代表表格的行,因此变量tr_str是我们往下写表格的重要依据。
二. 打印日历表格
可以使用两个for语句嵌套起来实现:外层for语句写行,内层for语句写单元格。
for(i=0;i<tr_str;i++) { //外层for语句 - tr标签 document.write("<tr>"); for(k=0;k<7;k++) { //内层for语句 - td标签 idx=i*7+k; //表格单元的自然序号 date_str=idx-firstday+1; //计算日期 //这里是处理有效日期代码 } //内层for语句结束 document.write("</tr>"); } //外层for语句结束
单元格的自然序号是否代表有效日期非常关键,为此必须加入一个过滤机制:仅打印有效的日期。有效的日期大于0小于小于等于处理月的总天数。
三. 以下是完整的JS日历代码:
function is_leap(year) { return (year%100==0?res=(year%400==0?1:0):res=(year%4==0?1:0)); } //是否为闰年 var nstr=new Date(); //当前Date资讯 var ynow=nstr.getFullYear(); //年份 var mnow=nstr.getMonth(); //月份 var dnow=nstr.getDate(); //今日日期 var n1str=new Date(ynow,mnow,1); //当月第一天Date资讯 var firstday=n1str.getDay(); //当月第一天星期几 var m_days=new Array(31,28+is_leap(ynow),31,30,31,30,31,31,30,31,30,31); //各月份的总天数 var tr_str=Math.ceil((m_days[mnow] + firstday)/7); //表格所需要行数 //打印表格第一行(有星期标志) document.write ("<table cellspacing='0'><tr><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr>"); for(i=0;i<tr_str;i++) { //表格的行 document.write("<tr>"); for(k=0;k<7;k++) { //表格每行的单元格 idx=i*7+k; //单元格自然序列号 date_str=idx-firstday+1; //计算日期 (date_str<=0 || date_str>m_days[mnow]) ? date_str=" " : date_str=idx-firstday+1; //过滤无效日期(小于等于零的、大于月总天数的) //打印日期:今天底色为红 date_str==dnow ? document.write ("<td bgcolor='red'>" + date_str + "</td>") : document.write ("<td>" + date_str + "</td>"); } document.write("</tr>"); //表格的行结束 } document.write("</table>"); //表格结束