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

时间:2015-01-19 08:49:48

标签: regex

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

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

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

先谢谢你们。

7 个答案:

答案 0 :(得分:45)

根据我的 earlier 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(?:Z|[+-][01]\d:[0-5]\d)$

Regular expression visualization

Debuggex Demo

有点怪异,但它检查有效日期,包括闰年(Proleptic Gregorian),适用于1000-9999年,检查无效时间,如2 5 :30或21:< strong> 9 4,最大UTC偏移量为+/- 19:59(或Z)。

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

完成时:此答案仅支持基于OP给出的示例的ISO8601标准的子集。哪个是时间段中的秒数和UTC偏移中的分钟的扩展表示法。为简洁起见,支持基本符号,其中省略了破折号和冒号,或者忽略UTC偏移中的分钟或最小单位。也不支持序数日期(一年中的日期)或一周一周的日期表示法。

正则表达式的扩展版本支持基本表示法,序数和省略秒/ UTC偏移分钟的时间here

答案 1 :(得分:6)

根据之前的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

答案 2 :(得分:2)

In this link我们根据我们想要包含的不同值看到不同的ISO 8601格式。

对于问题中的示例2015-01-17T18:23:02+00:00,下面的正则表达式应该可以正常工作。

[0-9]{4}-[0-9]{2}-[0-9]{2}T([0-9]{2}:){2}[0-9]{2}[+|-][0-9]{2}:[0-9]{2}

此处[+|-]适用于可能的时区偏移。

答案 3 :(得分:1)

If you just want to match time zones use this:

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

The max is + or - 19:59 which is sufficient

答案 4 :(得分:0)

与日期和时区匹配

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

进行测试

答案 5 :(得分:0)

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

DateTime。还包括可选的毫秒。

答案 6 :(得分:0)

如果不是必须使用正则表达式,我认为在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