今天用到一个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)的操作是错误的,会显示为一个负数值,一时还没有时间来找到这样问题的原因,以后再说吧,谁知道留个言告诉我也行。
最后奉献一段用到的日期变化小程序,在变化的同时,你当然可以绑定其他功能应用的代码进来,比如按月份显示数据的功能应用。

下载: timeSpan.txt
  1. window.onload=function(){     
  2.          date=new Date();
  3.          s.value=date.toLocaleString();
  4.          setMonth(0);
  5. } 
  6. function setMonth(step){
  7.         date.setDate(1);
  8.         date.setMonth(date.getMonth()+step);
  9.         var m=date.getMonth();
  10.         s.value=date.toLocaleString().substring(0,10);
  11.         var s1= {0:"1",2:"3",4:"5",6:"7",7:"8",9:"10",11:"12"};
  12.         var s2= {3:"4",5:"6",8:"9",10:"11"};
  13.         if(s1[m]!=undefined){date.setDate(31);}
  14.         else{
  15.             if(s2[m]!=undefined){date.setDate(30);}
  16.             else{if(date.getYear()%4==0) {date.setDate(29);}else{date.setDate(28);}}   
  17.         }
  18.         s.value+=date.toLocaleString().substring(0,10)
  19. }

对应的html代码:

  1. <input type="text" id="s" size="30"><br />
  2. <input type="button" onclick="setMonth(-1)" value="减一月">
  3. <input type="button" onclick="setMonth(1)" value="加一月">

其实应用中还遇到的一个问题是,页面中如果有多个这样的小程序来控制多个timeSpan,那显然一个date对象是不够用,会发生冲突的,暂时只能通过多设置几个对象来解决。