javascript正则表达式iso日期时间

javascript正则表达式iso日期时间,javascript,regex,datetime,iso,Javascript,Regex,Datetime,Iso,有人有一个很好的正则表达式模式来匹配iso日期时间吗 ie:2010-06-15T00:00:00对于严格的完整日期时间,包括毫秒,每 //-- Complete precision: /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/ //-- No milliseconds: /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[

有人有一个很好的正则表达式模式来匹配iso日期时间吗


ie:2010-06-15T00:00:00

对于严格的完整日期时间,包括毫秒,每

//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/

//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/

//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/

//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
.
实际情况允许的其他变化:

警告:这一切很快就会变得一团糟,而且它仍然允许某些废话,比如14个月。 此外,ISO 8601:2004(E)允许使用其他几种变体

.

“2010-06-15T00:00:00”不合法,因为它没有时区名称。

不确定它是否与您试图解决的基本问题相关,但您可以将ISO日期字符串作为构造函数arg to date()传递,并从中获取对象。构造函数实际上在将字符串强制转换为日期方面非常灵活。

该规范允许多种日期格式。关于如何做,有一个平庸的解释。Javascript的日期输入格式与不指定时区的简单日期的ISO格式之间存在相当小的差异,可以使用。完全支持ISO-8601规范是非常重要的

下面是一个参考示例,我不保证它是完整的,尽管它解析了前面提到的Wikipedia页面中的非持续时间日期

下面是一个例子,你也可以看到它的。不幸的是,它不符合规范,因为它没有正确地实现。ISO-8601中周数01的定义非常重要,需要浏览日历以确定第一周从何处开始,以及它在指定年份的天数方面的确切含义。这可能很容易纠正(我只是厌倦了玩它)


下面是一个正则表达式,用于检查ISO 8601日期格式,包括闰年和长短月。要运行此操作,您需要“忽略空白”。不带空白的压缩版本位于regexlib上:

ISO 8601还有更多内容-这个正则表达式只关心日期,但您可以轻松地扩展它以支持时间验证,这并不复杂

更新:现在可以使用javascript(没有lookbehinds)

为了满足时间的需要,在混合物中加入类似的东西(from:):


我把最上面的答案修改得更简洁了一点。元素作为可选语句嵌套,而不是写出三个可选模式中的每一个

/[+-]?\d{4}-[01]\d-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+))?[+-][0-2]\d:[0-5]\dZ?)/

我很好奇这种方法是否有缺点


您可以在此处找到我建议答案的测试:

对于仅匹配ISO日期,如2017-09-22,您可以使用以下regexp:

^\d{4}-([0]\d|1[0-2])-([0-2]\d|3[01])$

它将匹配任何数字年份、00-12范围内由两位数字指定的任何月份以及00-31范围内由两位数字指定的任何日期,并从1900年到2999年进行02/29验证

 (((2000|2400|2800|((19|2[0-9])(0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T([01][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9]{3}Z

我制作了这个正则表达式,并解决了日期的验证问题,因为日期来自Javascript的
.toISOString()
方法

(0[1-1-9[1-1-9[12[0-9[1-1-9[12[0-9[12[0-9[0-9[12[0-9[12[0-9[0-9]1243[3[0[469[1249[1240-9[10-9[0-9[0-9][0-9[0-9[0-9[12[12[12[0-9[0-9[12[0-9[12[0-9[0-9[12[12[12[12[12[12[0-12[0-12[0-9[0-9[12[0-12[12[0-9[12[12[12[12[12[12[12[12[12[12[12[12[12[0-9[12[12[0-9[0-9[0-9[0-9[0-9[0-9[0-9[0-9[0-}Z$

预期:

  • 在适当的位置使用适当的符号('-'、'T'、':'、'.'和'Z')
  • 与29、30或31天的月份一致
  • 从00点到23点
  • 从00到59的分和秒
  • 从000到999毫秒
未考虑:

  • 闰年
示例日期:
2019-11-15T13:34:22.178Z

示例直接运行在铬合金控制台上的实例:<<示例直接运行在铬合金控制台上的实例:<示例直接运行在铬合金控制台上的实例:<<<代码><<代码>><<<<<<<<<0-强>><0-0[13578[13578]1[1[1-1[1-1[1-1-1[1-1[1[12[0-9]1-1-1[1[0-9]1[1[0-1-1-1-1-0-9]之所以之所以之所以之所以[1[1[1[1[1[12[12[2[0-1-9[1-1-9[1-1-1-1-1-1-1-1-1-1-1-1-9[12[1-9[1-9[1-9]5][0-9])\[0-9]{3}Z$/.测试(“2019-11-15T13:34:22.178Z”)

Regex流程图():

yyyy-MM-dd 这里对大多数答案的解释太多了,这里是@Sergey的一个简短变体,它解决了一些奇怪的场景(如
2020-00-00
),这个
RegExp
只关心
yyyy-MM-dd
日期:

// yyyy-MM-dd
^\d{4}-([0][1-9]|1[0-2])-([0-2][1-9]|[1-3]0|3[01])$
此外,这一条并不关心每月的天数,比如
2020-11-31
(因为11月只有30天)


我的用例是将
字符串
转换为
日期
(从
API
参数),我只需要知道输入字符串没有包含奇怪的东西,我就对实际的
日期
对象进行下一次验证。

我使用
/^(\d{4})-0(\d+-0)(\d+[t]0(\d+:0)(\d+:0)(\d+$//code>,(但这并不是最严格的一个)…日期的转换是另一回事:)ISO-8601说,如果省略时区,则假定它是UTC,这包括“Z”。我完全同意维基百科不是一个确定的来源。但对于某些主题,它提供了一个合理的参考,关于ISO-8601的文章提供了令人愉快的例子和易于理解的解释:-德沃。这个答案在angular源代码中引用@为正则表达式准备的花絮。要稍微调整一下,我们可以使用
(?:)
而不是
()
来避免捕获组。e、 g.
\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d | Z)
用于第一个正则表达式。这将在闰秒内失败,即偶尔的第61秒。经确认,该方法不起作用。问题在于IE。2014-06-44变为2014-08-13,因为IE将溢出日期(>30)视为下个月的日期。我试过IE8和IE11。但它在Chrome中工作。非常烦人。这不适用于:2016-09-05T15:22:26.286Z Making
[+-][0-2]\d:[0-5]\d
可选使其工作:
[+-]\
([T\s](([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)?(\15([0-5]\d))?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?
^\d{4}-([0]\d|1[0-2])-([0-2]\d|3[01])$
 (((2000|2400|2800|((19|2[0-9])(0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T([01][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9]{3}Z
// yyyy-MM-dd
^\d{4}-([0][1-9]|1[0-2])-([0-2][1-9]|[1-3]0|3[01])$