关于在使用parseInt进行日期判断需要注意的地方

来源:互联网 发布:李兰娟院士知乎 编辑:程序博客网 时间:2024/06/05 20:20


今日,在做一个关于日期判断的一个小函数,是用javascript做的,发现一个BUg,代码如下:

function checkDate(arg_intYear,arg_intMonth,arg_intDay,year,period)
 {
 if(arg_intMonth.length!=2||arg_intDay.length!=2){
 alert("月份、天数必须为2位");
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
 else{
 if((parseInt(arg_intMonth)-3 != arg_intMonth-3 )||(parseInt(arg_intMonth) > 12 ) || (parseInt(arg_intMonth) < 1 ))
 {
 alert('月份不正确');
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
 else
 {
  if((parseInt(arg_intDay)-3 != arg_intDay-3 )||(parseInt(arg_intDay) > 31 )|| (parseInt(arg_intDay) < 1 ) )
  {
  alert('天数不正确');
  if(period<10)period="0"+period;
  document.getElementById("fdate").value=year+"-"+period+"-01";
  }
  else
  {
  if((parseInt(arg_intYear)-3 != arg_intYear-3 )||(parseInt(arg_intYear) < 1000 ) ||(parseInt(arg_intYear) > 5000 ))
  {
  alert('年份格式不正确');
  if(period<10)period="0"+period;
  document.getElementById("fdate").value=year+"-"+period+"-01";
        }
  if((parseInt(arg_intYear)-year)*12+(parseInt(arg_intMonth)-period)<0)
 {
 alert('不能输入期间以前的数据!');
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
  }
 }
 
 }
 }

    function cheDate(year,period){
var ghnn,lkjh;
lkjh=document.getElementById("fdate").value;
ghnn=lkjh.split("-");
if(ghnn.length==3){
checkDate(ghnn[0],ghnn[1],ghnn[2],year,period);
}else{
alert("日期格式不正确!格式应为(如): 2000-01-01");
if(period<10)period="0"+period;
document.getElementById("fdate").value=year+"-"+period+"-01";
}
}

当fdate中输入类似于2012-07-09时会报错,提示天数错误,百思不得其解,后来调试了下,发现parseint('09‘)时竟然输出了0,之后查了parseint函数的解释才明白这点,解释如下:

parseInt() 函数可解析一个字符串,并返回一个整数。

语法
parseInt(string, radix)

 

参数

描述

 

string

必需。要被解析的字符串。

 

radix


可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
 

返回值

返回解析后的数字。

说明

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。


也就是说当第一位为0时,则会判断错误,当做8进制来处理了,所以出错了。之后这样就好了:

function checkDate(arg_intYear,arg_intMonth,arg_intDay,year,period)
 {
 if(arg_intMonth.length!=2||arg_intDay.length!=2){
 alert("月份、天数必须为2位");
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
 else{
 if((parseInt(arg_intMonth)-3 != arg_intMonth-3 )||(parseInt(arg_intMonth) > 12 ) || (parseInt(arg_intMonth) < 1 ))
 {
 alert('月份不正确');
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
 else
 {
  if((parseInt(arg_intDay)-3 != arg_intDay-3 )||(parseInt(arg_intDay) > 31 )|| (parseInt(arg_intDay) < 1 ) )
  {
  alert('天数不正确');
  if(period<10)period="0"+period;
  document.getElementById("fdate").value=year+"-"+period+"-01";
  }
  else
  {
  if((parseInt(arg_intYear)-3 != arg_intYear-3 )||(parseInt(arg_intYear) < 1000 ) ||(parseInt(arg_intYear) > 5000 ))
  {
  alert('年份格式不正确');
  if(period<10)period="0"+period;
  document.getElementById("fdate").value=year+"-"+period+"-01";
        }
  if((parseInt(arg_intYear)-year)*12+(parseInt(arg_intMonth)-period)<0)
 {
 alert('不能输入期间以前的数据!');
 if(period<10)period="0"+period;
 document.getElementById("fdate").value=year+"-"+period+"-01";
 }
  }
 }
 
 }
 }

    function cheDate(year,period){
var ghnn,lkjh;
lkjh=document.getElementById("fdate").value;
ghnn=lkjh.split("-");
if(ghnn.length==3){
checkDate(ghnn[0],ghnn[1],ghnn[2],year,period);
}else{
alert("日期格式不正确!格式应为(如): 2000-01-01");
if(period<10)period="0"+period;
document.getElementById("fdate").value=year+"-"+period+"-01";
}
}

解决了问题