posts - 254, comments - 1230, trackbacks - 18, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

Javascript 日期校验完备全过程

Posted on 2004-08-06 08:34 FantasySoft 阅读(4348) 评论(9)  编辑 收藏 所属分类: All About SoftMiscellaneous

    在原来公司的项目组工作的过程中,自己实现了一个用于校验用户输入数据合法性的Javascript Validation Framework。在这个Framework实现的过程中,在参考了一些网上资源之后,自己写了一个日期校验的函数,满心以为这个校验函数已经够完备了,结果还是经历了多次的修改。   

function validateDate(year, month, day) 
{
    
var regex = new RegExp(/S/
);  
    
if(regex.test(day)&& regex.test(month) &&
 regex.test(year)) 
    {
        
var regExp = new RegExp(/d/
);
        
if(!regExp.test(day)|| !regExp.test(month) || !
regExp.test(year))
            
return ("The date fields contains non-number."
);
        
var tempDateValue = year + "/" + month + "/" +
 day;
        
if(tempDateValue.length < 6||tempDateValue.length > 10
)
            
return ("The length of date fields is invalid."
); 
        
var tempDate = new
 Date(tempDateValue);
        
if
(isNaN(tempDate))
            
return ("The scope of date fields is invalid."
);   
        
if(parseInt(year) > 1900 && parseInt(year) < 2500 &&
 ((tempDate.getUTCFullYear
()).toString()
==year) && (tempDate.getMonth()==parseInt(month)-1&&
 (tempDate.getDate()
==
parseInt(day)))
            
return ("The date fields is OK."
);
        
else

            
return ("The date fields is invalid.");
    }
}

                                                           (为了说明问题,代码略有改动)

        1、使用测试数据:year="2003",month="08",day="01"。这原本是一个合法的日期,然而出乎我的意料,返回的信息居然是:The date fields are invalid。根据返回的信息,将错误定位在最后一个条件语句。经过仔细的检查,发现parseInt("08") = 0,条件语句返回自然是false了。为什么parseInt("08")会得到这样的结果呢?原来parseInt在没有指定转化进制的时候,是根据字符串对应的进制进行转换,而以0开头的字符串都默认为八进制的,那么在八进制中8是不存在的,因此返回0也就不奇怪了。修改办法就是将所有的parseInt函数指定进制即可,如parseInt(month)改为parseInt(month,10)。
        2、使用测试数据:year="2000",month="01",day="01"。这个日期也是OK的,然而返回的信息也是:The date fields are invalid。这次的错误又是因为什么呢?原来错误在于getUTCFullYear,由于中国处于时区的东八区,而通过var tempDate = new Date(tempDateValue)获得日期的对象,默认是包含具体的时间,且初始化值为00:00:00。那么在中国是跨入二十一世纪了,可是在格林威治却仍然是1999年,那么出错也是自然的事情了,修改办法是将getUTCFullYear改为getFullYear即可。

Feedback

#1楼    回复  引用  查看    

2004-08-06 09:24 by 郑彬 [未注册用户]
抄抄微软的看看,他也有一个校验的啊。WebUIValidation.js文件的第 212行

#2楼    回复  引用  查看    

2005-04-28 14:24 by layout [未注册用户]
function checkDateTime(strTime)
{
var dateReg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/;
return dateReg.test(strTime.trim());
}

这样我觉得就差不多了?呵呵

#3楼 [楼主]   回复  引用  查看    

2005-04-29 00:47 by FantasySoft      
To layout:这样只能做最简单的校验,像大小月和闰年之类就不行了。

#4楼    回复  引用  查看    

2005-05-16 16:26 by roc [未注册用户]
如何才能实现大小年以及闰月和非闰月呀?

#5楼    回复  引用  查看    

2005-05-16 21:42 by FantasySoft      
To Roc:文中提供的代码已经实现了闰年及大小月的校验。

#6楼    回复  引用  查看    

2005-11-23 13:28 by rpdg [未注册用户]
// 要实在不爽就 try。。catch一下
function testDate(yyyy,mm,dd)
{
var aa = new Date(parseInt(yyyy,10), parseInt(mm,10)-1, parseInt(dd,10) );

if (aa.getMonth() != (parseInt(mm,10)-1))
{
alert("日期值错误!\n建议使用日历选择器来选择日期");
return "false";
}
else
{
alert("ok");
return "true";
}

}

testDate(2000,1,5);

#7楼    回复  引用  查看    

2007-01-19 15:53 by dana [未注册用户]
var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
if(r==null) return false;
var d = new Date(r[1], r[3]-1, r[4]);
alert (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);

#8楼    回复  引用  查看    

2007-08-23 13:34 by sunrise [未注册用户]
function Parse_Date(sDate)
{
var iaMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
var iaDate = new Array(3)
var year, month, day
var NowDate= new Date();
var TheYear=NowDate.getFullYear();
var TheMonth=NowDate.getMonth();
if (!sDate)
{
return;
}
if ((sDate.length==1 || sDate.length==2) && sDate<=30)
{
day=sDate;
month=TheMonth+1;
}else if (sDate.length==2)
{
month =sDate.substr(0,1);
day =sDate.substr(1,1);
}else if (sDate.length==3){
if (sDate.indexOf("-")>0)
{
iaDate = sDate.toString().split("-")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else if (sDate.indexOf("/")>0)
{
iaDate = sDate.toString().split("/")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else{
month =sDate.substr(0,1);
day =sDate.substr(1,2);
}
}else if (sDate.length==4){
if (sDate.indexOf("-")>0)
{
iaDate = sDate.toString().split("-")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else if (sDate.indexOf("/")>0)
{
iaDate = sDate.toString().split("/")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else{
month =sDate.substr(0,2);
day =sDate.substr(2,2);
}
}else if (sDate.length==5){
if (sDate.indexOf("-")>0)
{
iaDate = sDate.toString().split("-")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else if (sDate.indexOf("/")>0)
{
iaDate = sDate.toString().split("/")
month =parseFloat(iaDate[0]);
day =parseFloat(iaDate[1]);
}else{
month =sDate.substr(0,2);
day =sDate.substr(3,2);
}
}else{
if (sDate.indexOf("-")>0){
iaDate = sDate.toString().split("-")
}else{
iaDate = sDate.toString().split("/")
}

year = parseFloat(iaDate[0])
month = parseFloat(iaDate[1])
day=parseFloat(iaDate[2])
}

if (month==2)
{
// Check for leap year
if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) )
{ // leap year
if (day > 29)
{
return 0;
}
}else
{
if (day > 28)
{
return 0;
}
}
}
if ((month==4)||(month==6)||(month==9)||(month==11))
{
if (day > 30)
{
return 0;
}
}
return new Date(TheYear*1,(month*1-1),day*1);
}

#9楼    回复  引用  查看    

2007-12-27 23:32 by java综合网 [未注册用户]
http://www.javazh.cn
这篇文章很好呀!!!

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:59 编辑过
 
向地震灾区捐赠爱心