【问题标题】:Regex for testing date formatting用于测试日期格式的正则表达式
【发布时间】:2011-11-10 16:19:57
【问题描述】:

我在一个正则表达式示例站点中发现了一个非常有用的正则表达式,用于测试日期字段的格式和内容

但是当我输入早于 2000 年的日期时,我得到了验证,因为这是一个用于输入出生日期的字段,您可以看到为什么会出现问题。我确信这很容易解决,但正则表达式让我感到害怕。

$('#txtDOB').blur(function() {
//$('span.error-keyup-5').remove();
var inputVal = $(this).val();
var dateReg = /^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$/;
if(!dateReg.test(inputVal)) {
    alert('invalid date format: ' + inputVal);
}

我不同意这个解决方案,所以如果你能提出更好的方法,请发表评论。

【问题讨论】:

  • 正则表达式不是日期验证的首选工具(请参阅here为什么不)。他们可以检查“可能是日期的东西”,但如果您需要考虑日期范围、月份长度、闰年等,最好使用date parser
  • 这不是一个特别好的正则表达式,但我可以为你找到一个(特别是众多 {1} 毫无意义)
  • 为什么不直接创建一个 javascript 日期对象并使用它的原生函数?
  • 您的 RegEx 不能使用的日期是什么?看起来它应该接受 2000 年之后的日期。见 - jsfiddle.net/GGM6h
  • @ipr101 - 例如,该正则表达式声称 2100 年 2 月 29 日是有效的,但实际上并非如此。 (2100 年不是闰年。)

标签: javascript jquery regex


【解决方案1】:

我建议不要测试字符串是否匹配您认为可能是好的日期的一种或多种格式,而是询问 JavaScript it 是否认为它是有效日期:

function isValidDate(str){
  return !isNaN(new Date(str));
}

这假设您将接受用户以各种格式中的任何一种提供给您的内容(例如可怕的美国 MM/DD/YYYY 或更正常的 ISO8601 YYYY-MM-DD)时间>。相反,如果你有一个你只会接受的特定格式,那么基于它解析你的字符串,提取年/月/日,然后询问 JavaScript 这是否是一个有效的日期:

function isValidDate(year, month, date) {
  var d = new Date(year*=1, month-=1, date*=1, 12);    // noon to skip DST issues
  return d.getFullYear()==year && d.getMonth()==month; // wrong date->wrong month
}

您需要检查年/月/日是否全部匹配,因为new Date(2011,11,32) 被接受并解释为 2012-1-1。

另请参阅:Javascript method to ensure that a date is valid

【讨论】:

  • 您对使用其他 javascript 方法的建议正是我所需要的。
  • new Date("Hacker%1337") 返回字符串 'Tue Jan 01 1337 00:00:00 GMT-0600 (Central Standard Time)'
【解决方案2】:

那里有很多乱七八糟的东西。首先,消除所有 {1}。这仅意味着一个实例,这完全是多余的。此外,具有一个值的字符类与字符本身相同。因此,[1] 变为 1。

所以,这给我们留下了:

 /^[01]?\d\/(([0-2]?\d)|([3][01]))\/((199\d)|([2-9]\d{3}))$/

大概是 MM/DD/YYYY。但是 YYYY 只是 199[0-9] 并且任何年份 > 2000 和

作为一个基本的尝试:

 /^[01]?\d\/(([0-2]?\d)|([3][01]))\/([12]\d{3}))$/

这给出了 1000 - 2999 的年份范围。但正如 Tim 上面所说,如果您想要真正有效的日期,您应该使用特定的日期验证器。

【讨论】:

    【解决方案3】:

    如果您需要将日期字符串解析为日期,那么我会查看这个库:

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多