正则表达式日期+时间不起作用,但为什么?

时间:2017-12-20 09:04:17

标签: regex date time

我有以下(工作)正则表达式,它检查我,字符串是否是有效日期:

(?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(-)(?:0?2\1(?:29)))|(?:(?:[1-9]\d{3})(-)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8])))))

适用于这样的日期:07.12.2017

现在我想补充一点,该字符串也有一个检查正确性的时间。 我希望检查07.12.2017, 06:13的有效性。

我在前面的正则表达式(上面)中添加了这个表达式:

, ([0-1]?[0-9]|2[0-3]):[0-5][0-9]

但它不起作用。 谁能指出我,我做错了什么?

1 个答案:

答案 0 :(得分:0)

在我回答这个问题之前,我想说除了使用正则表达式之外,还有更好的方法可以验证这一点,因为二月不是简单的月份才能做到正确,有些年份它会有28天,有些则是将有29天,它也不仅仅是"每四年2月将有29天"无论是。在2100年,你会期望在这个借口下成为闰年,但事实并非如此,因为它不能被400整除。

你最好使用一个实际的日期库,因为在日期方面有很多变量,正则表达式只是一个糟糕的工具。

有了这个,我的回答是:

(?:(?:(?:[0-2]\d)\.(?:0\d|1[12]))|(?:30\.(?:0[469]|11))|(?:3[01]\.(?:0[13578]|1[02])))\.\d+(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$

这应该与您希望的格式匹配日期。

请参阅Regex101

修改

我只是搞了一下正则表达式以更好地为此提供功能。此函数将对闰年进行双重检查,并返回一个布尔值,表示日期是否有效。



function isValidDate(date) {
  let regex = /^(?:((?:[0-2]\d)\.(?:0\d|1[12]))|(30\.(?:0[469]|11))|(3[01]\.(?:0[13578]|1[02])))\.(\d+)(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$/,
    matches = date.match(regex);

  if (!matches) {
    return false;
  }

  let dayMonth = matches[1] || matches[2] || matches[3],
    year = matches[4],
    valid = !dayMonth || !year ? false : true;

  if (dayMonth == "29.02") {
    let divisibleBy = {four: year % 4 === 0, oneHundred: year % 100 === 0, fourHundred: year % 400 === 0 };
    if (year > 400) {
      if (!divisibleBy.four) {
        valid = false;
      }
      if (divisibleBy.four && divisibleBy.oneHundred && !divisibleBy.fourHundred) {
        valid = false;
      }
    }
  }
  return valid;
}

console.log(
  isValidDate("29.02.2100"),
  isValidDate("29.02.2000"),
  isValidDate("25.12.2017, 22:00"),
  isValidDate("31.05.1678"),
  isValidDate("32.05.1900"),
  isValidDate("29.02.32000, 06:15")
)