正则表达式随时间验证正确的ISO8601日期字符串

Jac*_*tle 17 regex

例如: 2015-01-17T18:23:02+00:00

由于字符串的某些组成部分被认为是"有效",因此在使用正则表达式时会遇到一些问题,因此可能不需要.

此外,字符串可以格式化为:2015-01-17T18:23:02Z轻微抛弃我

先谢谢你们.

fun*_*urm 50

根据我之前的答案,你可以做到这一点并且非常严格:

^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:Z|[+-][01]\d:[0-5]\d)$
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

Debuggex演示

稍微怪异,但它会检查有效日期,包括闰年(Proleptic阳历),适用于1000-9999年,为无效次检查,如2 5:30或21:9 4,最大UTC的+/-偏移19:59 (或Z).

(现在超过+14:00或-12:00不会发生,但未来可能会发生).

完成:此答案仅支持基于OP给出的示例的ISO8601标准的子集.哪个是时间段中的秒数和UTC偏移中的分钟的扩展表示法.为了简洁它支持基本记其中破折号和冒号被省略,或几分钟的在UTC偏差或最小单位的遗漏.也没有支持序数日期(一年中的日期)或一周一周的日期表示法.

支持基本符号,序数和省略秒/ UTC偏移分钟的正则表达式的扩展版本存在于此处.

  • 我不确定iso 8601偏移日期时间格式是否需要纳秒/秒的分数,但是这个正则表达式没有表明这个日期时间是有效的:2017-02-17T10:12:56.000008765+01:00 (3认同)
  • 几分之一秒对我有用: ^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[ 1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578] |1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][ 048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d (?:\.\d+|.{0})(?:Z|[+-][01]\d:[0-5]\d)$ (3认同)

Nic*_*aux 7

根据前面的答案,这个正则表达式处理秒的分数.

^(?:[1-9]\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,9})?(?:Z|[+-][01]\d:[0-5]\d)$
Run Code Online (Sandbox Code Playgroud)

Debuggex演示