如何使用Moment.js验证MMDDYYYY格式日期?存在验证异常
解决Moment.js验证MMDDYYYY格式日期的异常问题
我来帮你搞定这个日期验证的坑!你遇到的问题其实是因为使用的Moment.js版本太老旧(2.2.1),在严格模式下处理纯数字字符串时存在长度校验的bug——即使字符串长度不符合MMDDYYYY要求的8位,它也会错误地返回验证通过;而带字母的字符串因为无法被解析为数字类日期格式,所以能正常验证失败。
解决方案一:升级Moment.js版本
这是最直接的解决办法,新版本的Moment.js已经修复了这个长度校验的问题。你只需要把引用的脚本换成较新的版本(比如2.29.4),原有的严格模式验证代码就能正常工作:
// 引用新版本Moment.js // <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script> var dates = "08291975"; // 应验证通过 var passed = moment(dates, 'MMDDYYYY', true).isValid(); console.log('should pass ' + passed); // 输出 true dates = "082919751"; // 多一位数字,应验证失败 passed = moment(dates, 'MMDDYYYY', true).isValid(); console.log('should not pass ' + passed); // 输出 false dates = "0829ssss"; // 符合预期验证失败 passed = moment(dates, 'MMDDYYYY', true).isValid(); console.log('should not pass ' + passed); // 输出 false dates = "0829197"; // 少一位数字,应验证失败 passed = moment(dates, 'MMDDYYYY', true).isValid(); console.log('should not pass ' + passed); // 输出 false
解决方案二:无法升级时,手动添加前置校验
如果因为项目限制不能升级Moment.js,你可以在调用Moment验证前,先手动校验字符串的长度和是否为纯数字,再进行日期格式验证:
function isValidMMDDYYYY(dateStr) { // 第一步:校验是否为8位纯数字 if (!/^\d{8}$/.test(dateStr)) { return false; } // 第二步:用Moment严格验证日期格式和合法性(比如2月30号这类无效日期也会被拦截) return moment(dateStr, 'MMDDYYYY', true).isValid(); } // 测试用例 console.log(isValidMMDDYYYY("08291975")); // true(合法日期) console.log(isValidMMDDYYYY("082919751")); // false(长度不符) console.log(isValidMMDDYYYY("0829ssss")); // false(含非数字字符) console.log(isValidMMDDYYYY("0829197")); // false(长度不符) console.log(isValidMMDDYYYY("02301975")); // false(2月没有30号,非法日期)
这个方法既解决了长度校验的问题,还能保证日期本身的合法性,比如不存在的月份、日期都会被正确拦截。
内容的提问来源于stack exchange,提问作者BoundForGlory
相关产品推荐
相关产品推荐

