例如:2015-01-17T18:23:02+00:00
由于字符串的某些组成部分被视为“有效”,因此在使用正则表达式时会遇到一些问题,因此可能不需要。
此外,字符串可以格式化为:2015-01-17T18:23:02Z
轻微地抛弃我
先谢谢你们。
答案 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)$
有点怪异,但它检查有效日期,包括闰年(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)$
答案 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]$
进行测试
答案 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