regex 正则表达式验证ISO8601日期字符串与时间是否正确

w8ntj3qf  于 2022-11-18  发布在  其他
关注(0)|答案(7)|浏览(199)

例如:2015-01-17T18:23:02+00:00
正则表达式有一些问题,因为字符串的某些组件被认为是“有效”的,可能是推测的,可能不是必需的。
此外,字符串可以被格式化为2015-01-17T18:23:02Z的事实也让我有点困惑。

gywdnpxw

gywdnpxw1#

根据我之前的回答,你可以这样做,而且非常严格:

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

Debuggex Demo
有点奇怪,但它检查有效日期,包括闰年(Proleptic Gregorian),适用于1000-9999年,检查无效时间,如25:30或21:94,以及最大UTC偏移+/-19:59(或Z)。
(目前不会发生超过+14:00或-12:00的情况,但将来可能会发生)。
完成:根据OP给出的示例,此答案仅支持ISO 8601标准的一个子集。这是一种扩展的表示法,在时间部分中使用秒,在UTC偏移中使用分钟。为简洁起见,它支持省略破折号和冒号的基本表示法,也不支持序数日期(星期)或年-周-星期表示法。
一个支持基本表示法、序数和省略秒/UTC偏移分钟的正则表达式的扩展版本生存期为here

cfh9epnr

cfh9epnr2#

基于前面的answer,此正则表达式处理秒的小数

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

Debuggex Demo

gg58donl

gg58donl3#

在此链接中,我们可以看到基于我们希望包含的不同值的不同ISO 8601格式。
对于问题中的示例2015-01-17T18:23:02+00:00,下面的regex应该可以工作。
[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}
此处[+|-]表示可能的时区偏移量。

n3h0vuf2

n3h0vuf24#

如果您只想匹配时区,请使用以下命令:

^[+|-][0-1][0-9]:[0-5][0-9]$

最大值为+或- 19:59,这已足够

piok6c0g

piok6c0g5#

^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]{3})?(Z)?$

日期时间。也包含选择性的毫秒。

dgtucam1

dgtucam16#

如果使用regex不是强制性的,我认为在js中检测它的最好方法是这样做:

function isIso8601(value) {
    return new Date(value).toJSON() === value;
}
isIso8601('2019-08-21T16:35:05.073Z'); // true
isIso8601('2013-99-99T04:13:00+00:00'); // false
uxh89sit

uxh89sit7#

与日期和时区匹配

2019-07-01T24:15:00+19:00

\d{4}-[01]{1}\d{1}-[0-3]{1}\d{1}T[0-2]{1}\d{1}:[0-6]{1}\d{1}:[0-6]{1}\d{1}[+|-][0-1][0-9]:[0-5][0-9]$

在此测试https://regexr.com/4gmi2

相关问题