我见过JSON日期格式的许多不同标准:

"\"\\/Date(1335205592410)\\/\""         .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\""    .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z"              JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00"             ISO 8601

哪一个是正确的?还是最好的?这方面有什么标准吗?


当前回答

在Sharepoint 2013中,获取JSON格式的数据时,没有将日期转换为仅日期格式的格式,因为在该格式中,日期应为ISO格式

yourDate.substring(0,10)

这可能对你有帮助

其他回答

我认为这确实取决于用例。在许多情况下,使用适当的对象模型(而不是将日期呈现为字符串)可能更为有益,如下所示:

{
"person" :
      {
 "name" : {
   "first": "Tom",
   "middle": "M",
  ...
}
 "dob" :  {
         "year": 2012,
         "month": 4,
         "day": 23,
         "hour": 18,
         "minute": 25,
         "second": 43,
         "timeZone": "America/New_York"
    }   
   }
}

诚然,这比RFC 3339更冗长,但:

它也是人类可读的它实现了一个适当的对象模型(如在OOP中,只要JSON允许)它支持时区(而不仅仅是给定日期和时间的UTC偏移量)它可以支持更小的单位,如毫秒、纳秒。。。或者仅仅是小数秒它不需要单独的解析步骤(解析日期时间字符串),JSON解析器将为您完成一切轻松创建任何日期时间框架或任何语言的实现可以轻松扩展以支持其他日历刻度(希伯来文、中文、伊斯兰…)和时代(公元前、公元前…)10000年是安全的;-)(RFC 3339不是)支持全天日期和浮动时间(Javascript的Date.toJSON()不支持)

我不认为将日期序列化为JSON时真正需要正确的排序(如RFC 3339的funroll所指出的)。同样,这仅适用于具有相同时区偏移的日期时间。

在Sharepoint 2013中,获取JSON格式的数据时,没有将日期转换为仅日期格式的格式,因为在该格式中,日期应为ISO格式

yourDate.substring(0,10)

这可能对你有帮助

JSON本身没有日期格式,它不在乎任何人如何存储日期。然而,由于这个问题用javascript标记,我假设您想知道如何在JSON中存储javascript日期。您只需将日期传递给JSON.stringify方法,默认情况下,它将使用date.prototype.toJSON,而date.prototype.toISOString(MDN on date.toJSON):

const json = JSON.stringify(new Date());
const parsed = JSON.parse(json); //2015-10-26T07:46:36.611Z
const date = new Date(parsed); // Back to date object

我还发现每当我读取JSON字符串时,使用JSON.parse(JSON.pase上的MDN)的reviver参数将ISO字符串自动转换回javascript日期非常有用。

const isoDatePattern = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/);

const obj = {
 a: 'foo',
 b: new Date(1500000000000) // Fri Jul 14 2017, etc...
}
const json = JSON.stringify(obj);

// Convert back, use reviver function:
const parsed = JSON.parse(json, (key, value) => {
    if (typeof value === 'string' &&  value.match(isoDatePattern)){
        return new Date(value); // isostring, so cast to js date
    }
    return value; // leave any other value as-is
});
console.log(parsed.b); // // Fri Jul 14 2017, etc...

JSON对日期一无所知。.NET所做的是非标准的黑客/扩展。

我会使用一种可以很容易地转换为JavaScript中的Date对象的格式,即可以传递给新的Date(…)的格式。最简单也是最可移植的格式是1970年以来包含毫秒的时间戳。

没有正确的格式;JSON规范没有指定交换日期的格式,这就是为什么有这么多不同的方法。

最好的格式可以说是以ISO 8601格式表示的日期(参见维基百科);它是一种众所周知且广泛使用的格式,可以跨多种不同语言处理,因此非常适合互操作性。例如,如果您可以控制生成的json,则可以以json格式向其他系统提供数据,选择8601作为日期交换格式是一个不错的选择。

例如,如果您无法控制生成的json,那么您是来自多个不同现有系统的json的使用者,最好的处理方法是使用日期解析实用程序函数来处理不同的格式。