做JS API时,发现JQuery校验插件的一个时间校验问题。
最终目的:输入一个字符串,校验如果是正确的日期,则通过,否则给出提示。
做法:
$("#validateForm").validate({
debug : true,
rules : {"date" : {
isDate : true
}
},
messages : {
"date" : {
date : "日期格式不正确"
}
}
效果:输入201300 报错,2014/01/01 正确 2014-01-01正确 20140101错误,这个地方可以做格式转换
问题:输入2016-04-31,竟然校验通过了,一脸黑线
原因:特意调出了JQuery validate的框架代码,原来是通过校验new Date(value)来判断日期是否有效。
// http://docs.jquery.com/Plugins/Validation/Methods/date
date: function(value, element) {
return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
}
然后,就试了一下new Date()函数
new Date("2016-04-31")
Sun May 01 2016 08:00:00 GMT+0800 (中国标准时间)
new Date()会把4月31号直接转换成5月1号,只能说太智能了,但这种显然不是我们想要的效果
解决方法:解决就从new Date()下手,转换成日期后,查出日期的月份,如果此时的月份和传入日期的月份不一致,说明日期又问题,解决!
//日期
jQuery.validator.addMethod("isDate", function(value, element){
var ereg = /^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/;
var r = value.match(ereg);
if (r == null) {
return false;
}
var d = new Date(r[1], r[3] - 1, r[5]);
var result = (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[5]);
return this.optional(element) || (result);
}, "请输入正确的日期");