如何实现mm/dd/yyyy格式校验且日期小于当前日期的正则表达式?
mm/dd/yyyy格式日期校验(含早于当前日期规则)实现方案
首先需要明确:正则表达式仅能完成格式合法性校验,无法直接实现「小于当前系统日期」的逻辑,完整校验需要结合「正则格式校验+日期解析比较」两步完成。
1. 第一步:mm/dd/yyyy格式正则校验
基础格式校验正则
仅校验输入是否符合数字占位规则,不校验日期本身是否合法(比如不会拦截02/30/2024这类不存在的日期):^(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])/(19|20)\d\d$
各部分规则说明:
(0?[1-9]|1[012]):匹配月份,支持1位或2位写法,范围01-12(或1-12)(0?[1-9]|[12][0-9]|3[01]):匹配日期,支持1位或2位写法,范围01-31(或1-31)(19|20)\d\d:匹配年份,默认限定为1900-2099区间,可根据业务需求调整年份范围
如果需要严格校验不存在的日期,更推荐在格式校验通过后转成日期对象判断,比写复杂的正则更易维护、准确率更高。
2. 第二步:校验日期小于当前系统日期
通用逻辑流程
- 先用正则校验输入字符串是否符合mm/dd/yyyy格式,不符合直接返回校验失败
- 格式校验通过后,将字符串按分隔符拆分出月、日、年,解析为日期对象,同时二次校验日期本身是否合法(排除
02/30这类非法值) - 获取当前系统日期,将时分秒置为0,避免同一天内的时间差导致误判
- 比较目标日期和当前日期,若目标日期小于当前日期则校验通过,否则失败
JavaScript实现示例
function validatePastDate(inputStr) { // mm/dd/yyyy格式正则校验 const dateRegex = /^(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/(19|20)\d\d$/; if (!dateRegex.test(inputStr)) return false; // 拆分日期并校验日期合法性 const [month, day, year] = inputStr.split('/').map(Number); const targetDate = new Date(year, month - 1, day); // 避免Date自动转义非法日期,比如2月30日会被转成3月1日 if ( targetDate.getFullYear() !== year || targetDate.getMonth() !== month - 1 || targetDate.getDate() !== day ) { return false; } // 获取当前日期(时分秒置0,仅比较日期部分) const now = new Date(); const currentDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()); // 比较是否早于当前日期 return targetDate < currentDate; }
内容的提问来源于stack exchange,提问作者Raquib
相关产品推荐
相关产品推荐

