在做查询时,我们通常用到时间范围作为查询条件,最近在接到一个任务是只能查询一个月的数据,要求选择了开始日期,那么结束日期如果超过一个月,就自动变成开始日期往后一个月的日期,在做表单提交,我们系统中是如下处理的:
function checkDateSpace(){
var startObj = document.getElementById("date1");
var endObj = document.getElementById("date2");
var starDate = startObj.value;
var endDate = endObj.value;
var strSubDate = starDate.split("-");
var strYear = strSubDate[0];
var strMonth = strSubDate[1];
var strDay = strSubDate[2];
var endSubDate = endDate.split("-");
var endYear = endSubDate[0];
var endMonth = endSubDate[1];
var endDay = endSubDate[2];
var msg = "时间间隔最大只能一个月";
var allStartDate = new Date(strYear,strMonth,strDay);
var allEndDate = new Date(endYear,endMonth,endDay);
if((allEndDate-allStartDate)/86400000>31){
alert(msg);
endObj.value = setEndDate(starDate);
return false;
}
return true;
}
function setEndDate(start){
var startDates = start.split("-");
var y = startDates[0];
var m = startDates[1];
var d = startDates[2];
var sd = parseInt(d)-1;
var sm = parseInt(m)+1;
var yy="";
var mm="";
var dd="";
yy = y;
mm = sm;
dd = sd;
switch(parseInt(m)){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(sd == 0){
dd = "31";
mm = m;
}else{
if(m == "12"){
mm = "1";
yy = parseInt(y)+1;
}
}
break;
case 4:
case 6:
case 9:
case 11:
if(sd == 0){
dd = "30";
mm = m;
}
break;
case 2:
if(sd == 0){
if((parseInt(y)%4==0 && parseInt(y)%100!=0) || parseInt(y)%400==0){
dd = "29";
}else{
dd="28";
}
mm = m;
}
break;
}
return yy+"-"+mm+"-"+dd;
}
上面代码中date1为开始日期,date2为结束日期,这样基本能够实现上面的要求,不过,出现一个bug,就是当date1为8或9月的时候,date2就出现了当年的1月0号这个bug,网上搜了,原来是这样的:
对于parseInt("01")到parseInt("07");都能得到正确的结果,但如果是parseInt("08") 或parseInt("09")则返回0;
首先看parseInt语法:parseInt(string, radix);
其中string为要转换的字符串,radix为二进制,八进制,十六进制或十进制。
在默认不指定radix时,当以0x开关时,为十六进制;如果以0开关且第二位不为x,则让为是八进制,(因为八进制不能有8,9所以报错返回0)。
所以,在我们用时还是明确指定进位制,以防出错。
如我们平时都用十进制位,我们就 parseInt("08", 10);
因此只需将37行,改成switch(parseInt(m,10)){ 即可