JSON 文本 ( RFC 4627 ) 对对象、数组、字符串、数字、布尔值(字面意思true
或false
)和null
. 但是,它没有定义任何时间信息,如日期和时间,这在应用程序中很常见。鉴于RFC 4627中规定的约束和语法,当前使用哪些方法来表示 JSON 中的时间?
受访者须知:此问题的目的是记录已知流通的各种方法以及示例和相关优缺点(最好来自现场经验)。
JSON 文本 ( RFC 4627 ) 对对象、数组、字符串、数字、布尔值(字面意思true
或false
)和null
. 但是,它没有定义任何时间信息,如日期和时间,这在应用程序中很常见。鉴于RFC 4627中规定的约束和语法,当前使用哪些方法来表示 JSON 中的时间?
受访者须知:此问题的目的是记录已知流通的各种方法以及示例和相关优缺点(最好来自现场经验)。
ISO 8601似乎是一个自然的选择,但如果你想用在浏览器中运行的 JavaScript 来解析它,你将需要使用一个库,因为浏览器对 JavaScriptDate
对象中可以解析 ISO 8601 日期的部分的支持不一致,即使在相对较新的浏览器中。ISO 8601 的另一个问题是它是一个庞大而丰富的标准,并且日期/时间库仅支持它的一部分,因此您必须选择您使用的库支持的 ISO 8601 子集来使用。
相反,我将时间表示为自 1970-01-01T00:00Z 以来的毫秒数。在更旧的浏览器中,对象的构造函数可以理解这一点Date
,至少可以追溯到 IE7(这是我测试过的最古老的浏览器)。
没有固定的文字,所以使用对你来说最简单的。对于大多数人来说,这要么是 UTC 输出的字符串,要么是以 UTC 为中心的时间码的长整数。
阅读更多背景信息:http: //msdn.microsoft.com/en-us/library/bb299886.aspx
我推荐使用RFC 3339格式,它既美观又简单,并且被越来越多的语言、库和工具所理解。
不幸的是,RFC 3339、Unix 纪元时间和 JavaScript 毫秒时间都还不够准确,因为它们都没有考虑闰秒!在某些时候,我们都将不得不再次重新审视时间表示。也许下次我们可以完成它。
很抱歉对这样一个老问题发表评论,但在随后的几年里,出现了更多的解决方案。
在 JSON 中表示日期和/或时间信息是在 JSON 中表示复杂类型和复杂数据结构的更普遍问题的一个特例。使问题变得棘手的部分原因是,如果您将复杂类型(如时间戳)表示为 JSON 对象,那么您需要有一种表达关联数组和对象的方式,这恰好看起来像您的时间戳的 JSON 对象表示,就像其他一些标记的对象。
Google 的协议缓冲区有一个JSON 映射,它具有时间戳类型的概念,并具有定义的语义。
MongoDB 的BSON有一个扩展 JSON,上面写着{ "$date": "2017-05-17T23:09:14.000000Z" }
.
除了日期时间之外,两者还可以表达更复杂的结构。