当前位置: 首页 > 知识库问答 >
问题:

Regex验证正确的ISO8601日期字符串与时间

刘承运
2023-03-14

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

正则表达式有一些问题,因为字符串的某些组成部分被认为是“有效”的是推测的,可能不需要。

此外,字符串可以格式化为:2015-01-17T18:23:02Z这一事实也让我有些困惑

提前谢谢各位。

共有3个答案

郭建华
2023-03-14

在此链接中,我们可以看到基于我们希望包含的不同值的不同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}

这里[ |-]表示可能的时区偏移。

祁聪
2023-03-14

基于前面的答案,这个正则表达式处理秒的分数。

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

调试程序演示

吕承福
2023-03-14

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

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

调试程序演示

有点怪异,但它会检查有效日期,包括闰年(前公历),适用于1000-9999年,检查无效时间,如25:30或21:94,以及最大UTC偏移量/-19:59(或a Z)。

(现在超过14:00或-12:00的情况不会发生,但将来可能会发生)。

完整性:根据OP给出的示例,此答案仅支持ISO8601标准的一个子集。这是扩展的表示法,时间段中有秒,UTC偏移量中有分钟。为简洁起见,它不支持省略破折号和冒号的基本表示法,也不支持在UTC偏移量或最小单位中省略分钟。也不支持序数日期(一年中的某一天)或年-周-周标记。

正则表达式的扩展版本支持基本符号、序数和省略秒/UTC偏移分钟。

 类似资料:
  • 问题内容: 我正在尝试对JavaScript应用程序中的日期进行序列化/反序列化。 服务器端,我使用Java,JodaTime已安装在上面。我发现了如何使用UTC时区序列化为ISO,但是找不到如何进行反向操作。 这是我的代码 我不在乎是否使用Joda,只需要一个快速且有效的解决方案, 问题答案: 如果您使用的是Java 7或更早版本,则可以参考此文章。 如果您使用的是Java 8,则可以执行以下操

  • 在PHP中,我需要检查一个字符串是否为以下格式: 其中x、y和z是整数。因此,字符串包含3个整数,由2个破折号分隔,规则如下: 验证这一点最简单的方法是什么?

  • 我有一个变量,它包含以下值: 我目前正在使用以下代码将其格式化为字符串:.使用此代码,我得到以下值: 我需要这个更准确。我想要得到的精确值在以下精度范围内: 我在以下链接上做了一些研究:http://www.w3.org/TR/NOTE-datetime 以下是我的发现: 此配置文件没有指定可以使用多少位数来表示每秒的小数部分。允许分数秒的采用标准必须规定最小位数(大于或等于一的数字)和最大位数(

  • 问题内容: 我从声称的API获取下一个字符串 所有日期格式均为ISO8601。 我正在尝试下一个代码: 不幸的是,结果 updatedAt 为nil 问题答案: 您的日期格式不正确,您需要考虑毫秒。 需要澄清的是,在日期格式中添加可以解决此问题。

  • 问题内容: 我从API收到日期字符串,其格式为。 我目前正在使用正则表达式来验证字符串格式,这种方法可以正常工作,但是我可以看到某些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即,例如。 PHP中是否有更好的方法来接收诸如这样的字符串,并确定该日期是否为该格式的有效日期? 问题答案: 您可以为此目的使用类: 测试用例:

  • 我从API接收一个日期字符串,它的格式为。 我目前正在使用正则表达式来验证字符串格式,它工作正常,但是我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。 在PHP中有没有更好的方法来获取字符串,例如,并判断它是否是格式的有效日期?