日期:2014-05-16  浏览次数:20392 次

对pwc_pengwenchao【用js验证指定格式的时间】问题的解析

?pwc_pengwenchao (高级程序员)的问题如下:写道
用js验证指定格式的时间
悬赏:30 发布时间:2010-12-10 提问人:pwc_pengwenchao (高级程序员)

< > 猎头职位: 安徽: 合肥,杭州:高薪诚聘前端开发工程师
Java代码
function dateISO(value, format)
{
// 这里如何写
}

dateISO('2010-12-10 17:25:10', 'yyyy-MM-dd HH:mm:ss'); //验证通过

dateISO('2010-12-10 17:25:10', 'yyyy-MM-dd HH:mm'); //验证不通过

dateISO('2010-12-10', 'yyyy-MM-dd'); //验证通过

dateISO('2010-12-10 17:25', 'yyyy-MM-dd HH:mm'); //验证通过

dateISO('17:25:10', 'HH:mm:ss'); //验证通过

就是输入的时间要和格式相匹配。

格式:可以有 yyyyMMdd HHmmss 这种的。

嗯 就先这两种吧,一种为有 - 的,一种 无 。先谢谢啦。

Step 1 分析:

???? 这个问题的解答,我们可以试着去想怎样去实现一个日期格式的转化,也就是通常语言中的Date类中的format ,指定一个yyyy/MM/dd HH:mm:ss ffff 就能对指定日期进行转换。

?????上面所讲的format,核心实现原理就是正则替换,现在我们来思考这个问题,这么确定格式正确,首先我们应该想到利用正则匹配来验证格式是否正确。因此我们可以做的是这样:

????? '2010-12-10 17:25:10', '\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}'

我们可以用后面的正则来验证前面的日期是否符合格式,这样我们便有了方法:

????? 我们需要将'yyyy-MM-dd HH:mm:ss' 转换为正则表达式:

var dateSourcePattern = 'yyyy-MM-dd HH:mm:ss' ;
var dateFormatPattern = dateSourcePattern
.replace('yyyy','[0-9]{4}')
.replace('MM','[0-9]{1,2}')
.replace('dd','[0-9]{1,2}')
.replace('HH','[0-9]{1,2}')
.replace('mm','[0-9]{1,2}')
.replace('ss','[0-9]{1,2}');

?这样转化为了正则后,就可以与以前的日期进行匹配了。

Step 2,给出解决问题的代码实现:

?

<html>
<head></head>
<body>
	
</body>
</html>
<script type="text/javascript">
	
/*
dateISO('2010-12-10 17:25:10', 'yyyy-MM-dd HH:mm:ss'); //验证通过 

dateISO('2010-12-10 17:25:10', 'yyyy-MM-dd HH:mm'); //验证不通过 

dateISO('2010-12-10', 'yyyy-MM-dd'); //验证通过 

dateISO('2010-12-10 17:25', 'yyyy-MM-dd HH:mm'); //验证通过 

dateISO('17:25:10', 'HH:mm:ss'); //验证通过 
*/


var DateFormatter = {
	Patterns:{
		YEAR      : /y/g,
		MONTH     : /M/g,
		DAY       : /d/g,
		HOUR      : /H/g,
		MINUTE    : /m/g,
		SECOND    : /s/g,
		MILSECOND : /f/g
	},
	FormatPatterns:function(format){
		return eval("/"+
				format
				.replace(this.Patterns.YEAR,'[0-9]')
				.replace(this.Patterns.MONTH,'[0-9]')
				.replace(this.Patterns.DAY,'[0-9]')
				.replace(this.Patterns.HOUR,'[0-9]')
				.replace(this.Patterns.MINUTE,'[0-9]')
				.replace(this.Patterns.SECOND,'[0-9]')
				.replace(this.Patterns.MILSECOND,'[0-9]')+
				"/g");
	},
	DateISO:function(value,format){
		var formatReg = "";
		if(value == "" || format=="")
			return false;
		formatReg = this.FormatPatterns(format);
		alert(formatReg);
		return formatReg.test(value);
	}
}

var ret = DateFormatter.DateISO('2010-1d-10 17:25:10', 'yyyy-MM-dd HH:mm:ss'); 
alert(ret);  //false
var ret1 = DateFormatter.DateISO('2010-10-10 17:25:10', 'yyyy-MM-dd HH:mm:ss'); 
alert(ret1); //true
</script>
?

好了,问题解决了,不过需要注意的是:这里我的正则替换并不是非常严格,因为日期由特定的格式,并不是只要是数字就可以的,比如月份最大只能匹配12,所以细节问题还是需要改善,这里仅是提高一种方法。