在一般的项目中,常常遇到日期格式的校验问题。在网上搜索了几下,没有找到比较好用的日期校验函数,特别是指定日期格式format(如mmddyyyy)时的校验,为此,花了一点时间,写就如下内容:
<html>
<head>
<script>
/**
* 日期格式及合法性验证
* @author yehailong
* @param obj 需要验证的对象
* @param fmt 日期格式字符串, 由yyymmdd(不区分大小写)组合而成,分隔符可以为'-'、'.'、'/'之一
* @param name 对象显示名,便于提示,如不传此参数,不alert提示
* @return boolean 通过返回true,否则false
*/
function checkDate(obj,fmt,name){
if(obj==null||obj=="undefined"||obj.disabled||obj.value==""){
return true;
}
if(name==null){
name="";
}else{
name="“"+name+"”";
}
var regex = new Array("-",".","/");
var regex0 = "";
for (var i=0;i<regex.length ;i++ ){
if(fmt.indexOf(regex[i])!=-1){
regex0 = regex[i];
break;
}
}
var y = 0;
var m = 0;
var d = 0;
var yearIndex = 0;
var monthIndex = 0;
var dayIndex = 0;
var number = new Array(0,0,0);
var ch = '';
var index = 0;
for (var i=0;i<fmt.length ;i++ )
{
if(ch==''||fmt.charAt(i)==ch){
number[index] = number[index]+1;
}else if(fmt.charAt(i)!=regex0){
index++;
number[index] = number[index]+1;
}
ch = fmt.charAt(i);
if(fmt.charAt(i)=='Y'||fmt.charAt(i)=='y'){
if(y==0){
yearIndex = i;
}
y++;
}
if(fmt.charAt(i)=='M'||fmt.charAt(i)=='m'){
if(m==0){
monthIndex = i;
}
m++;
}
if(fmt.charAt(i)=='D'||fmt.charAt(i)=='d'){
if(d==0){
dayIndex = i;
}
d++;
}
}
var sreg = "";
for(i in number){
if(number[i]!=0){
if(sreg!=""){
sreg += regex0;
}
sreg += "//d{"+number[i]+"}";
}
}
sreg = "^"+sreg+"$";
var reg = new RegExp(sreg ,"i");
if(!reg.test(obj.value)){
alert(name+"格式应匹配'"+fmt+"'");
setFocus(obj);
return false;
}
//判断日期的合法性
var dateStr = obj.value;
var year = "";
var month = "";
var day = "";
year = dateStr.substring(yearIndex,yearIndex+y);
month = dateStr.substring(monthIndex,monthIndex+m);
day = dateStr.substring(dayIndex,dayIndex+d);
if(month.charAt(0)=='0'){
month = month.charAt(1);
}
if(day=="")
day = 1;
var date = new Date(year,month-1,day);
var newYear = date.getFullYear();
var newMonth = date.getMonth()+1;
if(newMonth<10) newMonth = "0"+newMonth;
var newDay = date.getDate();
if(newDay<10) newDay = "0"+newDay;
var newDate = dateStr;
function temp(src,start,end,tgt){
var pre = "";
if(start!=0){
pre = src.substring(0,start);
}
var back = "";
if((end+1)!=src.length){
back = src.substring(end+1,src.length);
}
return pre+tgt+back;
}
if(y!=0){
newDate = temp(newDate,yearIndex,yearIndex+y-1,newYear);
}
if(m!=0){
newDate = temp(newDate,monthIndex,monthIndex+m-1,newMonth);
}
if(d!=0){
newDate = temp(newDate,dayIndex,dayIndex+d-1,newDay);
}
if(dateStr!=newDate){
if(confirm(name+"'"+dateStr+"'自动转换为'"+newDate+"'")){
obj.value = newDate;
}
}
return true;
}
function setFocus(obj){
try{
obj.focus();
var rng = obj.createTextRange(); rng.collapse(false); rng.select();
}catch(e){}
}
function hh(){
var obj = document.getElementById('test');
checkDate(obj,'mmddyyyy','出生日期')
}
</script>
日期:<input type="text" id="test" οnblur="checkDate(this,'mmddyyyy','日期')">(mmddyyyy)