You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:08