JSON模式检查YYYY-MM-DD格式的日期

37

有人能告诉我如何使用 JSON Schema 验证只接受 YYYY-MM-DD 格式的日期吗?

我的示例 JSON:

{"data1" : "foo", "date" :"2016-11-24"}

请添加您的示例JSON。 - S B
已更新。 - user6543599
5个回答

48

JSON Schema已经定义了日期、时间、日期时间、电子邮件、主机名和IP地址的格式。相比编写自己的正则表达式,您可以选择这种更简单和推荐的方法。

"date": {
  "type": "string",
  "format": "date"
}

日期和时间格式的名称来自于RFC 3339,第5.6节[RFC3339]。

参考资料:http://json-schema.org/latest/json-schema-validation.html#rfc.section.7.3


2
根据JSON规范,似乎这些格式并非强制要求。这是正确的吗?https://json-schema.org/understanding-json-schema/reference/string.html#format - nsx
1
@リカルド,我认为这个注释很明确:“JSON Schema的实现不需要实现规范的这一部分,而且许多实现并没有这样做。” - ceving
1
文档说明格式不影响验证 - Troy Weber
它基于您使用的JSON模式验证器。 我主要使用ajv,它考虑了格式字段并进行验证。 您可能需要与您使用的验证器进行检查。 @TroyWeber - Ram Babu
1
@RamBabu 感谢您的澄清。如果现在更新您的回复以包括一些 JSON-schema 验证器允许您验证此可选格式,我建议这样做,因为这是最受欢迎的答案,仅出于清晰度的考虑。否则,我很高兴听到 ajv 支持此行为。 - Troy Weber

4

使用内置支持进行日期验证:

{"type": "string", "format": "date"}

你的回答可以通过添加更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人确认你的答案是正确的。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community
1
这不是与此答案相同的解决方案吗? - Eric Aya
1
请注意,文档还指出“格式”更像是注释,没有第三方库,它不会触发任何验证。 - Troy Weber

4

在JSON Schema中添加正则表达式,请使用以下内容:

{
   "type": "string",
   "pattern": "^\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])$"
}

使用这个正则表达式将会接受2月30日,这就是我的问题。 - user6543599
哦,好的,你只是指出了格式问题...但是对于有效性,你可以参考以下链接。https://dev59.com/8HVD5IYBdhLWcg3wNYxZ#8768241 - Alekhya
刚刚尝试了一下,出现了错误:ValueError: Invalid \escape。 - GDB
1
双重转义 \\d - bwicklund
1
\d 不是正则表达式特性的支持子集的一部分。 - barfuin
正确的模式: ^(?:\d{4})-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])$ - Abinash

1

请使用以下解决方案...它适用于所有格式为YYYY-MM-DD或YYYY/MM/DD的日期。它验证了闰年并限制了二月份的日期。

{
   "type": "string",
   "pattern": "(((19|20)([2468][048]|[13579][26]|0[48])|2000)[/-]02[/-]29|((19|20)[0-9]{2}[/-](0[469]|11)[/-](0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}[/-](0[13578]|1[02])[/-](0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}[/-]02[/-](0[1-9]|1[0-9]|2[0-8])))"
}

0

使用纪元秒儒略日可能更容易:

{"type":"number"}

使用ISO 8601时间戳代替正则表达式

{"type":"string","pattern":"^(?:[1-9][0-9]{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9][0-9](?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:Z|[+-][01][0-9]:[0-5][0-9])$"}

注意:也许非捕获组需要被移除。我用于测试的实现接受它。这可能取决于具体实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接