JSON文本(RFC 4627)具有对象,数组,字符串,数字,布尔值(字面意思true
或false
)和null
的明确表示。但是,它没有定义用于表示时间信息,如日期和时间,这在应用程序中非常常见。考虑到RFC 4627中列出的约束和语法,目前使用哪种方法来表示JSON中的时间?
对受访者的注意:这个问题的目的是记录已知的各种方法以及实例和相关的利弊(最好是从实地经验)。
答案 0 :(得分:13)
我在使用中看到的唯一表示(尽管如此,我的经验仅限于DOJO)是ISO 8601,它运作良好,并且代表了您可能想到的任何事物。
例如,您可以访问上面的链接。
优点:
缺点:
答案 1 :(得分:5)
ISO 8601 似乎是一个很自然的选择,但是如果你想用在浏览器中运行的JavaScript来解析它,你将需要使用一个库,用于浏览器支持的部分。即使在相对较新的浏览器中,可以解析ISO 8601日期的JavaScript Date
对象也不一致。 ISO 8601的另一个问题是它是一个庞大,丰富的标准,并且日期/时间库仅支持其中的一部分,因此您必须选择要使用的库的ISO 8601子集。< / p>
相反,我将时间表示为自1970-01-01T00:00Z 以来的毫秒数。在许多旧版浏览器中,Date
对象的构造函数可以理解这一点,至少可以回到IE7(这是我测试过的最早的)。
答案 2 :(得分:2)
没有固定文字,所以请使用最简单的方法。对于大多数人来说,这是UTC输出的字符串或以UTC为中心的时间码的长整数。
阅读本文以获取更多背景信息:http://msdn.microsoft.com/en-us/library/bb299886.aspx
答案 3 :(得分:0)
我建议使用RFC 3339格式,这种格式既美观又简单,并且可以通过越来越多的语言,库和工具来理解。
不幸的是,RFC 3339,Unix纪元时间和JavaScript毫秒时间都不太准确,因为它们都没有占据闰秒!在某些时候,我们将不得不再次重新审视时间表示。也许下次我们可以完成它。
答案 4 :(得分:0)
很抱歉对这么老的问题发表评论,但在此期间,出现了更多的解决方案。
在JSON中表示日期和/或时间信息是在JSON中表示复杂类型和复杂数据结构的更一般问题的特例。使问题变得棘手的一部分原因是,如果您将复杂类型(如时间戳)表示为JSON对象,那么您需要一种表达关联数组和对象的方式,这看起来像是时间戳的JSON对象表示,就像其他一些标记对象。
Google的protocol buffers有一个JSON mapping,它具有时间戳类型的概念,具有已定义的语义。
MongoDB的BSON有一个Extended JSON,上面写着{ "$date": "2017-05-17T23:09:14.000000Z" }
。
除了datetime之外,两者还可以表达更复杂的结构。