协慌网

登录 贡献 社区

如何格式化 Microsoft JSON 日期?

我正在使用 jQuery 在Ajax 上进行第一次破解。我将数据放到我的页面上,但是我在为 Date 数据类型返回的 JSON 数据方面遇到了一些麻烦。基本上,我得到的字符串看起来像这样:

/Date(1224043200000)/

从全新的人到 JSON - 如何将其格式化为短日期格式?这应该在 jQuery 代码中的某个地方处理吗?我使用$.datepicker.formatDate()尝试了jQuery.UI.datepicker插件,但没有成功。

仅供参考:这是我提出的解决方案,结合了以下答案:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

此解决方案从回调方法获取对象,并使用日期格式库正确显示页面上的日期。

答案

Eval 不是必需的。这样可以正常工作:

var date = new Date(parseInt(jsonDate.substr(6)));

substr 函数取出 “/ Date(” 部分,并且 parseInt 函数获取整数并忽略最后的 “)/”。生成的数字将传递到 Date 构造函数中。

编辑:我故意遗漏了基数(第二个参数为 parseInt); 请参阅下面的评论 。此外,我完全同意Rory 的评论 :ISO-8601 日期比这种旧格式更受欢迎 - 因此这种格式通常不应用于新开发。请参阅优秀的Json.NET库,以获得使用 ISO-8601 格式序列化日期的绝佳选择。

对于 ISO-8601 格式的 JSON 日期,只需将字符串传递给 Date 构造函数:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

您可以使用它来从 JSON 获取日期:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

然后,您可以使用JavaScript 日期格式脚本(缩小和 gzip 时为 1.2 KB)根据需要显示它。

对于那些使用 Newtonsoft Json.NET 的人 ,请阅读如何通过IE8,Firefox 3.5 和 Json.NET 中的 Native JSON 进行操作

另外,关于更改 Json.NET 编写的日期格式的文档很有用: 使用 Json.NET 序列化日期

对于那些懒得的人来说,这是快速的步骤。由于 JSON 具有松散的 DateTime 实现,因此您需要使用IsoDateTimeConverter() 。请注意,由于 Json.NET 4.5 的默认日期格式是 ISO,因此不需要下面的代码。

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

JSON 将通过 as

"fieldName": "2009-04-12T20:44:55"

最后,一些 JavaScript 将 ISO 日期转换为 JavaScript 日期:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

我这样用它

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);