参考:
http://expert.csdn.net/Expert/TopicView1.asp?id=1779160

解决方案 »

  1.   

    1.使用正则表达式       
                            /// <summary>
    /// 校验具有value属性的控件的value年月日字符串是否合法(Date:YYYY-MM-DD),不合法就给出提示信息并使其获得焦点。
    /// </summary>
    /// <param name="date">待较验的年月日字符串</param>
    /// <returns>True,合法;False:不合法,并返回错误信息:message</returns>
    /// 使用方法:ID指控件的ID标识;onBlur:失去焦点
    /// onBlur="javascript:IsValidDate(ID);"
    function IsValidDate(ID)
    {  
    var sDate=ID.value.replace(/(^\s+|\s+$)/g,""); //去两边空格;
    if(sDate=="")
    return true;
    //如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为""
                //数据库中,合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式
    var s = sDate.replace(/[\d]{4,4}[\-/]{1}[\d]{1,2}[\-/]{1}[\d]{1,2}/g,"");
    if (s=="") //说明格式满足YYYY-MM-DD或YYYY-M-DD或YYYY-M-D或YYYY-MM-D
    {
    var t=new Date(sDate.replace(/\-/g,"/"));
    var ar = sDate.split(/[-/ :]/);
    var k = false;
    if(ar[0] != t.getYear() || ar[1] != t.getMonth()+1 || ar[2] != t.getDate())
    k = true;
    if(k)
    {
    alert("错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。");
    ID.focus();
    return false;
    }
    }
    else
    {
    alert("错误的日期格式!格式为:YYYY-MM-DD或YYYY/MM/DD。注意闰年。");
    ID.focus();
    return false;
    }
    return true;
    }
      

  2.   

    2.取出不同部分进行校验
    /// 使用方法:ID指控件的ID标识;onBlur:失去焦点
    /// onBlur="javascript:IsValidDate(ID);"
    function IsValidDate(ID)
    {
    var iYear, iMonth, iDay ;
    var sYear = null, sMonth = null, sDay = null;
    var iLen;
    var result;
    var message;  //错误提示信息 message = null;
    date = ID.value.replace(/(^\s+|\s+$)/g,""); //去空格
    //可以不输入
    if ((date == null)||(date =="")) 
    {
    result = true;
    return result;
    } iLen = date.length;

    if ((iLen < 8)||(iLen > 10))
    {
    message = "日期格式错误[YYYY-MM-DD],最短为8位(如:2003-1-1),最长为10位(如:2003-10-10)";
      
    result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    else
    {
    try
    {
    //取年。注意:字符串从0开始。 sYear = date.substring(0,4);
    //校验年是否有效正整数
    if (!IsDatePlusInteger(sYear))
    {
    message = "[年]中有非法字符,请输入数字。格式为:YYYY-MM-DD。";

    result  = false;
    window.alert(message);
    ID.focus();
    return result; //[年-月-日]中年有非法字符:输入的不是数字[0..9]
    }
    //校验年的范围
    iYear = parseInt(sYear);
    if ((iYear < 1900) || (iYear > 3000) )
    {
    message ="[年份]不切实际,请输入范围在1900-3000之间的年份。格式为:YYYY-MM-DD。"; result  = false;
    window.alert(message);
    ID.focus();
    return result; 
    }
    //校验年和月之间的-
    if (date.substring( 4,5) != "-") 
    {
    message = "年和月之间要用\"-\"连接,格式为:YYYY-MM-DD"; result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    //
    //根据日期的长度,取月
    //
    if (iLen==8) //月,日都为1位[YYYY-M-D]
    sMonth = date.substring(5,6);
    if (iLen==9) //月,日中有一项为1位[YYYY-MM-D]或[YYYY-M-DD]
    {
    if(date.substring(7,8)=="-") //[YYYY-MM-D]
    {
    sMonth = date.substring(5,7);
    }
    else if(date.substring(6,7)=="-") //[YYYY-M-DD]
    {
    sMonth = date.substring(5,6);
    }
    else 
    {
    message = "月和日之间要用''-''连接,格式为:YYYY-MM-DD";
    result  = false;
    window.alert(message);
    ID.focus();
    return result; 
    }

    if (iLen==10) //月,日都为2位[YYYY-MM-DD]
    sMonth = date.substring(5,7);
    //
    //校验月是否有效正整数
    //
    if (!IsDatePlusInteger(sMonth))
    {
    message ="[月]中有非法字符,请输入数字!格式为:YYYY-MM-DD。"; result  = false;
    window.alert(message);
    ID.focus();
    return result;  //[年-月-日]中有非法字符:输入的不是数字[0..9]
    }
    //
    //校验月的范围
    //
    iMonth = parseInt(sMonth);
    if ((iMonth < 1) || (iMonth > 12))
    {
    message = "[月份]错误,只能从1月到12月!格式为:YYYY-MM-DD。"; result  = false;
    window.alert(message);
    ID.focus();
    return result; 
    }
    //
    //根据日期的长度,取日,并校验月和日之间的-
    //
    if (iLen==8) //月,日都为1位[YYYY-M-D]
    {
    sDay = date.substring(7,8);

    if (date.substring(6,7) !="-") 
    {
    message = "月和日之间要用''-''连接,格式为:YYYY-MM-DD"; result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    }
    if (iLen==9) //月,日中有一项为1位[YYYY-MM-D]或[YYYY-M-DD]
    {
    if(date.substring(7,8)=="-") //[YYYY-MM-D]
    {
    sDay = date.substring(8,9);
    if (date.substring(7,8) !="-") 
    {
    message = "月和日之间要用''-''连接,格式为:YYYY-MM-DD"; result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    }
    if(date.substring(6,7)=="-") //[YYYY-M-DD]
    {
    sDay = date.substring(7,9);
    if (date.substring(6,7) !="-") 
    {
    message = "月和日之间要用''-''连接,格式为:YYYY-MM-DD"; result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    }
    }
    if (iLen==10) //月,日都为2位[YYYY-MM-DD]
    {
    sDay = date.substring(8,10);

    if (date.substring(7,8) !="-") 
    {
    message = "月和日之间要用''-''连接,格式为:YYYY-MM-DD"; result  = false;
    window.alert(message);
    ID.focus();
    return result;
    }
    }
    //
    //校验日是否有效正整数
    //
    if (!IsDatePlusInteger(sDay))
    {
    message = "[日]中有非法字符,请输入数字!格式为:YYYY-MM-DD。";

    result  = false;
    window.alert(message);
    ID.focus();
    return result; //[年-月-日]中有非法字符:输入的不是数字[0..9]
    }
    iDay =  parseInt(sDay);
    //
    //校验天
    //
    if (!isValidDay(iYear, iMonth, iDay)) 
    {
    result  = false;
    message = "天不正确。";
    //window.alert(message);
    ID.focus();
    return result; 
    }
    result  = true; return result;
    }
    catch(e)
    {
    //提示信息
    message = "[年-月-日]中有非法字符。格式为:YYYY-MM-DD。";

    result  = false;
    window.alert(message);
    ID.focus();
    return result; 
    }
    }
    }
      

  3.   


                      /// <summary>
    /// 校验一个日期字符串是否是正整数:[0..9]:可用于序号检验
    /// 不合法就给出提示信息
    /// 它与普通字符串的区别在于:日期字符串的月,日第一位可以为0,
    /// 正整数字符串的第一位不能是 0
    /// </summary>
    /// <param name="sInt">待较验的字符串</param>
    /// <returns>True,合法;False:不合法</returns>
    /// 使用方法:ID指控件的ID标识
    /// if(!IsDatePlusInteger(document.all.ID.value)) {document.all.ID.focus();//获得焦点}
    function IsDatePlusInteger(sInt)
    {
    var i,j;  
    var strx;
    var result;
    var errorMessage;  //错误提示信息 result = true;
    errorMessage = null;
    strx = sInt.replace(/(^\s+|\s+$)/g,"");
    //
    //可以不输入
    //
    if((strx == "")||(strx == null)) 
    {
    result = true;
    }
    //
    //检查每个字符是否"数字":[0..9]
    //
    for( i = 0 ;i<strx.length;i++)
    if ("0123456789".indexOf(strx.substring(i,i+1),0) == -1)
    {
    errorMessage = "数字有非法字符,请输入正整数[0-9]";
    //window.alert(errorMessage);
    result = false;
    break;
    }
    return result;
    } /// <summary>
    /// 校验某年是否闰年,在此之前,首先要校验年是正确的。
    /// </summary>
    /// <param name="iYear">待较验的年</param>
    /// <returns>True,合法;False:不合法</returns>
    function IsLeapYear(iYear)
    {
    //满足下面条件之一:能够被4整除但不能被100整除或者能被400整除。
    return (iYear % 100)?(iYear % 4==0):(iYear % 400==0)
    }

    /// <summary>
    /// 校验日期(年-月-日)的天数是否正确(Date:YYYY-MM-DD),在此之前,
    /// 首先要校验年月是正确的。
    /// </summary>
    /// <param name="iYear">待较验日期的年</param>
    /// <param name="iMonth">待较验日期的月</param>
    /// <param name="iDay">待较验日期的日</param>
    /// <returns>True,合法;False:不合法</returns>
    function isValidDay(iYear,iMonth,iDay)
    {
    var iMaxDay;
    var result;
    var message;  //错误提示信息

    result = true;
    message = null;

    try
    {
    switch (iMonth) 
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
    iMaxDay = 31; //月大
    if ((iDay < 0) || (iDay > iMaxDay))
    {
    message = "[天]错误," + iMonth + "月的天的范围是[1-31]!";
    result = false;
    }
    break;
    case 4:
    case 6:
    case 9:
    case 11:
    iMaxDay = 30; //月小
    if ((iDay < 0) || (iDay > iMaxDay))
    {
    message = "[天]错误," + iMonth + "月的天的范围是[1-30]!";
    result = false;
    }
    break;
    case 2:
    if (IsLeapYear(iYear))
    {
    iMaxDay = 29; //闰年
    if ((iDay < 0) || (iDay > iMaxDay))
    {
    message = "闰年。[天]错误," + iYear + "年" + iMonth + "月的天的范围是[1-29]!";
    result = false;
    }
    }
    else 
    {
    iMaxDay = 28; //平年
    if ((iDay < 0) || (iDay > iMaxDay))
    {
    message = "平年。[天]错误," + iYear + "年" + iMonth + "月的天的范围是[1-28]!";
    result = false;
    }
    }
    break;
    default:
    message = "日期输入不正确";
    result = false;
    break;
    }
    }
    catch(e)
    {
    //提示信息
    message = e;

    result = false;
    }
    if(!result)
    window.alert(message);
    return result;
    }