需求:
校验日期是否符合YYYY-MM-DD的格式,且日期是否为合法日期。
思路:
先通过正则表达式校验日期的格式是否符合FORMAT。
var dateReg = /^(\d{4})-(\d{2})-(\d{2})$/;
其中的()是正则表达式中的捕获组,可以通过RegExp.$1 的方法取出 () 中匹配到内容,等一下可以直接将匹配到的年月日取出来。
然后判断还需要判断是否是一个合法日期,比如2月是没有30号的,所以2020-02-30不是一个合法的日期。
可以借用JS中自带的 Date() 对象进行校验,Date() 支持传入年月日的新建方式:
var d = new Date(year, month, days);
新建 Date() 对象时会将日期转化为合法日期,比如 2020-02-30 被转化为 2020-3-1。通过判断进行转化后的日期是否与原来相同的方法来判断日期是否合法。
以下是完整代码:
var dateReg = /^(\d{4})-(\d{2})-(\d{2})$/;
function verifyDate(dateStr, dateReg){
//日期格式不匹配
if( !dateReg.test(dateStr) ){
return false;
}
//使用捕获组获取日期
var date = {
year : RegExp.$1,
month : RegExp.$2,
day : RegExp.$3,
}
//使用 Date() 对象,新建对象时会将日期转化为合法日期
//比如 2020-02-30 被转化为 2020-3-1
var dateObj = new Date(date.year, date.month-1, date.day);
if( date.year != dateObj.getFullYear() || date.month != dateObj.getMonth()+1 || date.day != dateObj.getDate() ){
return false;
}
return true;
}
var test1 = "2020-11-25";
var test2 = "2020-02-30";
var test3 = "a2020-11-256";
var test4 = "2020-1-1";
console.log(verifyDate(test1,dateReg)); //true
console.log(verifyDate(test2,dateReg)); //false
console.log(verifyDate(test3,dateReg)); //false
console.log(verifyDate(test4,dateReg)); //false