有趣的JavaScript日期函数
今天用到一个js实现的日期按照月显示的功能(就是2008年1月1日–2008年1月31日)点击加或减按钮,做相应的调整,并去执行对应的ajax操作,不料遇到了点小问题,按钮点击后的结果死活有不正确的地方,要么日期跳得不正确,如从1月1日-1月31日突然变到3月1日-3月31日,要么不动了,而且有错误,如原本正常显示是9月1日-9月30日,不料变成了9月1日-10月1日。后来去追查原因,发现一些有意思的事情。
JavaScript中的日期可以通过var date = new Date();之后,用date.getMonth()和date.setMonth()之类的函数来读取和设置日期的。以date.getMonth()为例,当前月份是10月份,取出来的结果却为9,开始以为是date.setMonth()那里出错了,后来才明白原来这些日期值是存储在数组中的,而数组的下标是从0开始的。因为要判断当前月份是大是小来决定最后一天的日期是30还是31,以及闰年和2月份处理的问题,于是,有了下面这样古怪的判断:var m=date.getMonth(); var s1= {0:”1″,2:”3″,4:”5″,6:”7″,7:”8″,9:”10″,11:”12″}; if(s1[m]!=undefined){date.setDate(31);},明明是看是否是大月份,对应的判断数字却是小月份的数字。
同样在日期处理上,JavaScript中的日期是存在一个“换算”关系的,比如当前月份设置为9月,但日期不小心设置成了date.setDate(31); JavaScript是会自动换算成下一个月的,得到的结果将是10月1日,而不是错误的9月31日。(后面的小程序就在运行起始设置了date.setDate(1); 实际上也是为了防止这个问题)
还有一个没弄明白的问题,ff下面的getYear()得到的年份是108,而ie下面是正确的2008,而且ff下date.setYear(date.getYear()+1)的操作是错误的,会显示为一个负数值,一时还没有时间来找到这样问题的原因,以后再说吧,谁知道留个言告诉我也行。
最后奉献一段用到的日期变化小程序,在变化的同时,你当然可以绑定其他功能应用的代码进来,比如按月份显示数据的功能应用。
- window.onload=function(){
- date=new Date();
- s.value=date.toLocaleString();
- setMonth(0);
- }
- function setMonth(step){
- date.setDate(1);
- date.setMonth(date.getMonth()+step);
- var m=date.getMonth();
- s.value=date.toLocaleString().substring(0,10);
- var s1= {0:"1",2:"3",4:"5",6:"7",7:"8",9:"10",11:"12"};
- var s2= {3:"4",5:"6",8:"9",10:"11"};
- if(s1[m]!=undefined){date.setDate(31);}
- else{
- if(s2[m]!=undefined){date.setDate(30);}
- else{if(date.getYear()%4==0) {date.setDate(29);}else{date.setDate(28);}}
- }
- s.value+=date.toLocaleString().substring(0,10);
- }
对应的html代码:
- <input type="text" id="s" size="30"><br />
- <input type="button" onclick="setMonth(-1)" value="减一月">
- <input type="button" onclick="setMonth(1)" value="加一月">
其实应用中还遇到的一个问题是,页面中如果有多个这样的小程序来控制多个timeSpan,那显然一个date对象是不够用,会发生冲突的,暂时只能通过多设置几个对象来解决。









11月 4th, 2008 at 15:52
这个好玩
11月 4th, 2008 at 16:58
to:蓇葖果
贵客啊,这个你也能看出来好玩啊