我见过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

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


当前回答

“2014-01-01T23:28:56.782Z”

日期以表示UTC时间(由Z表示)的标准可排序格式表示。ISO 8601还通过将Z替换为时区偏移的+或–值来支持时区:

“2014-02-01T09:28:56.321-10:00”

ISO 8601规范中的时区编码还有其他变体,但–10:00格式是当前JSON解析器支持的唯一TZ格式。一般来说,最好使用基于UTC的格式(Z),除非您特别需要确定生成日期的时区(只有在服务器端生成时才可能)。

NB:

    var date = new Date();
    console.log(date); // Wed Jan 01 2014 13:28:56 GMT- 
    1000 (Hawaiian Standard Time) 
        
    var json = JSON.stringify(date);
    console.log(json);  // "2014-01-01T23:28:56.782Z"

告诉你,这是首选方式,尽管JavaScript没有标准格式

// JSON encoded date
var json = "\"2014-01-01T23:28:56.782Z\"";

var dateStr = JSON.parse(json);  
console.log(dateStr); // 2014-01-01T23:28:56.782Z

其他回答

JSON本身并没有指定日期的表示方式,但JavaScript确实如此。

您应该使用Date的toJSON方法发出的格式:

2012-04-23T18:25:43.511Z

原因如下:

它是人类可读的,但也简洁它排序正确它包括分数秒,这有助于重建年表符合ISO 8601ISO 8601已在国际上建立了十多年ISO 8601由W3C、RFC3339和XKCD认可

也就是说,每一个写过的日期库都可以理解“自1970年以来的毫秒”。因此,为了便于携带,ThiefMaster是正确的。

首选的方法是使用2018-04-23T18:25:43.511Z。。。

下图显示了为什么这是首选方式:

因此,正如您所看到的,Date有一个原生的方法toJSON,它以这种格式返回,并且可以很容易地再次转换为Date。。。

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

{
"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所指出的)。同样,这仅适用于具有相同时区偏移的日期时间。

“2014-01-01T23:28:56.782Z”

日期以表示UTC时间(由Z表示)的标准可排序格式表示。ISO 8601还通过将Z替换为时区偏移的+或–值来支持时区:

“2014-02-01T09:28:56.321-10:00”

ISO 8601规范中的时区编码还有其他变体,但–10:00格式是当前JSON解析器支持的唯一TZ格式。一般来说,最好使用基于UTC的格式(Z),除非您特别需要确定生成日期的时区(只有在服务器端生成时才可能)。

NB:

    var date = new Date();
    console.log(date); // Wed Jan 01 2014 13:28:56 GMT- 
    1000 (Hawaiian Standard Time) 
        
    var json = JSON.stringify(date);
    console.log(json);  // "2014-01-01T23:28:56.782Z"

告诉你,这是首选方式,尽管JavaScript没有标准格式

// JSON encoded date
var json = "\"2014-01-01T23:28:56.782Z\"";

var dateStr = JSON.parse(json);  
console.log(dateStr); // 2014-01-01T23:28:56.782Z

以下代码对我有效。此代码将以DD-MM-YYYY格式打印日期。

DateValue=DateValue.substring(6,8)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(0,4);

否则,还可以使用:

DateValue=DateValue.substring(0,4)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(6,8);