javascript正则表达式iso日期时间

IT技术 javascript regex datetime iso
2021-02-25 19:00:11

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

即:2010-06-15T00:00:00

6个回答

对于严格的、完整的日期时间,包括毫秒,根据W3C 对规范的看法。:

//-- 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))/

.
实际ISO 8601:2004(E) 文档允许的其他变化

/********************************************
**    No time-zone varients:
*/
//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+/

//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d/

//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d/

//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d)/

警告:这一切很快就会变得混乱,它仍然允许某些废话,例如第 14 个月。此外,ISO 8601:2004(E) 允许多种其他变体。

.
"2010-06-15T00:00:00" 不合法,因为它没有时区指定。

哇。角度源代码中引用了此答案!@布罗克亚当斯
2021-04-25 19:00:11
我完全同意维基百科不是权威来源。但是对于某些主题,它提供了合理的参考,并且关于 ISO-8601 的文章具有可口的示例和易于理解的解释。:-D
2021-04-29 19:00:11
感谢您的正则表达式。稍微调整一下,我们可以使用(?: )代替( )来避免捕获组。例如\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)对于第一个正则表达式。
2021-05-01 19:00:11
这将失败闰秒,即偶尔的第 61 秒。
2021-05-06 19:00:11
ISO-8601 表示,如果省略时区,则假定为 UTC,这包括“Z”。
2021-05-09 19:00:11

为了匹配 ISO 日期,比如 2017-09-22,你可以使用这个正则表达式:

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

它将匹配任何数字年份、由 00-12 范围内的两位数字指定的任何月份以及由 00-31 范围内的两位数字指定的任何日期

00 如何对月或日有效?
2021-04-25 19:00:11

我将最佳答案改写为更简洁的内容。不是写出三个可选模式中的每一个,而是将元素嵌套为可选语句。

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

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

你可以在这里找到我建议的答案的测试:http : //regexr.com/3e0lh

这导致我的身份验证令牌被捕获,因为它具有与 section 匹配的匹配部分\d{4}
2021-04-21 19:00:11
这允许奇怪的事情有效为:28T09:5220.5690463826472487295963210360122513980205942+01:53 在 Chrome 控制台中试试这个来检查它:/[+-]?\d{4}(-[-[01]-d] \d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?[+-][0-2]\d: [0-5]\dZ?)?)?)?/.test("28T09:5220.5690463826472487295963210360122513980205942+01:53");
2021-04-24 19:00:11
这不适用于: 2016-09-05T15:22:26.286Z 制作[+-][0-2]\d:[0-5]\d可选使其工作:[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?([+-][0-2]\d:[0-5]\d)?Z?)?)?)?
2021-04-26 19:00:11

这是检查 ISO 8601日期格式的正则表达式,包括闰年和短月。要运行它,您需要“忽略空白”。regexlib 上有一个没有空格的压缩版本:http: //regexlib.com/REDetails.aspx?regexp_id=3344

ISO 8601 还有更多内容——这个正则表达式只关心日期,但您可以轻松扩展它以支持时间验证,这并不那么棘手。

更新:这现在适用于 javascript(没有lookbehinds)

  ^(?:
      (?=
            [02468][048]00
            |[13579][26]00
            |[0-9][0-9]0[48]
            |[0-9][0-9][2468][048]
            |[0-9][0-9][13579][26]              
      )

      \d{4}

      (?:

        (-|)

        (?:

            (?:
                00[1-9]
                |0[1-9][0-9]
                |[1-2][0-9][0-9]
                |3[0-5][0-9]
                |36[0-6]
            )
            |
                (?:01|03|05|07|08|10|12)
                (?:
                  \1
                  (?:0[1-9]|[12][0-9]|3[01])
                )?            
            |
                (?:04|06|09|11)
                (?:
                  \1
                  (?:0[1-9]|[12][0-9]|30)
                )?            
            |
                02
                (?:
                  \1
                  (?:0[1-9]|[12][0-9])
                )?

            |
                W(?:0[1-9]|[1-4][0-9]|5[0-3])
                (?:
                  \1
                  [1-7]
                )?

        )            
      )?
  )$
  |
  ^(?:
      (?!
            [02468][048]00
            |[13579][26]00
            |[0-9][0-9]0[48]
            |[0-9][0-9][2468][048]
            |[0-9][0-9][13579][26]              
      )

      \d{4}

      (?:

        (-|)

        (?:

            (?:
                00[1-9]
                |0[1-9][0-9]
                |[1-2][0-9][0-9]
                |3[0-5][0-9]
                |36[0-5]
            )
            |
                (?:01|03|05|07|08|10|12)
                (?:
                  \2
                  (?:0[1-9]|[12][0-9]|3[01])
                )?

            |
                (?:04|06|09|11)
                (?:
                  \2
                  (?:0[1-9]|[12][0-9]|30)
                )?
            |
                (?:02)
                (?:
                  \2
                  (?:0[1-9]|1[0-9]|2[0-8])
                )?
            |
                W(?:0[1-9]|[1-4][0-9]|5[0-3])
                (?:
                  \2
                  [1-7]
                )?
       ) 
    )?
)$

为了满足时间,在混合物中添加类似的东西(来自:http : //underground.infovark.com/2008/07/22/iso-date-validation-regex/):

([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)?)?)?

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

^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z$

考虑:

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

未考虑:

  • 闰年。

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

直接在 Chrome 控制台中运行的示例: /^[0-9]{4}-((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(02)-(0[1-9]|[12][0-9]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])\.[0-9]{3}Z$/.test("2019-11-15T13:34:22.178Z");

正则表达式流程图(Regexper): 正则表达式流程图

对不起,但它不是更好,因为它不处理闰年。
2021-05-02 19:00:11
如果不验证闰年,为什么要使用如此复杂的正则表达式?都不是闰秒
2021-05-10 19:00:11
这更好,因为其他人没有兑现他们的Promise。请尝试使用我在上一条评论中建议的页面的不同答案中的其他正则表达式,您将看到我试图解释的内容。
2021-05-12 19:00:11
@Toto 因为是之前发布的那些中最好的。它尊重我在“考虑”部分指出的每个项目。试试这个答案中的正则表达式和之前使用这个网站发布的另一个,你就会明白我在说什么。(我还评论了其他每个正则表达式中的问题,说明了为什么它们有缺陷)
2021-05-19 19:00:11