永发信息网

如何用JS写一个日历

答案:1  悬赏:70  手机版
解决时间 2021-02-06 08:00
如何用JS写一个日历
最佳答案
首先必须解决的问题是表格的行与列问题。列是固定的,七列,因为一周有七天。行需要动态计算,因为,每一个月的第一天是星期几是一个变数,因而第一天在表格中的第几个单元也就跟着变化,同时,每个月的总天数不一致也影响着各个月对表格行数的需要量。


一. 表格的行数问题
1.首先取得处理月的总天数
JS不提供此参数,我们需要计算。考虑到闰年问题会影响二月份的天数,我们先编写一个判断闰年的自编函数:
function is_leap(year) {
return (year%100==0?res=(year%400==0?1:0):res=(year%4==0?1:0));
}
接着定义一个包含十二个月在内的月份总天数的数组:
m_days=new Array(31,28+is_leap(ynow),31,30,31,31,30,31,30,31,30,31);
m_days这个数组里,二月份的天数已经加入闰年的信息:28+is_leap(ynow)。数组元素从0开始,正好对应于JS提供的Date函数提供的getMonth返回值,即0表示一月,1表示二月,2表示三月,依此类推。
这样,各月总数可以这样取得:m_days[x]。其中,x为0至11的自然数。
2.计算处理月第一天是星期几
可以使用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;idocument.write("");
for(k=0;k<7;k++) { //内层for语句 - td标签
idx=i*7+k; //表格单元的自然序号
date_str=idx-firstday+1; //计算日期
//这里是处理有效日期代码
} //内层for语句结束
document.write("");
} //外层for语句结束
单元格的自然序号是否代表有效日期非常关键,为此必须加入一个过滤机制:仅打印有效的日期。有效的日期大于0小于小于等于处理月的总天数。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
头晕鼻炎想睡觉怎么回事?睡眠时间8小时
小花仙密码申诉可以改绑定手机吗
金泽宾馆(红河州开远市)地址在哪,我要去那里
根据以下资料,回答题。2010年上半年,全国原
芳芳纸箱胶带批发部地址在哪,我要去那里办事
大行皇帝的意思是什么啊?知道的请说下!
木棉花的棉絮是什么
福兴宾馆(红河州开远市)地址有知道的么?有点
门前认证发票详细流程 急啊!!最后一步 怎么
解方程求x,x-2分之2+x的平方-4分之6x=x+2分之
成语接龙起死回生
感冒快一星期了还流鼻涕咳嗽,咳嗽痰有点黄,
成语玩命猜一个天平无论二字答案是什么
人和缘酒店(红河州开远市)地址在哪,我要去那
干物女歌词什么意思
推荐资讯
斯莱斯克莱德大学怎么样
闳丽的意思是什么啊?知道的请说下!
已经报名验兵了,到了那天不去可以吗,不会有
烟台石英石台面哪家好
中国的银行哪个能把欧元硬币兑换成人民币。。
缺金木水的男孩名字
滁州市城市管理行政执法局南谯分局怎么去啊,
51+(2304-2042)x23简便计算
苏客隆购物中心地址有知道的么?有点事想过去
水王的意思是什么啊?知道的请说下!
手机联网卸载 软件与不联网卸载软件的区别
确乎()复返()意思是……
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?