ASP.NET MVC JsonResult Date Format

2022-08-30 00:27:09

我有一个控制器操作,它有效地简单地返回我的模型的JsonResult。因此,在我的方法中,我有如下内容:

return new JsonResult(myModel);

这很好,除了一个问题。模型中有一个 date 属性,它似乎在 Json 结果中返回,如下所示:

"\/Date(1239018869048)\/"

我应该如何处理日期,以便以我需要的格式返回日期?或者,如何在脚本中处理上述格式?


答案 1

只是为了扩展casperOne的答案

JSON 规范不考虑日期值。MS必须进行调用,他们选择的路径是利用字符串的javascript表示中的一个小技巧:字符串文本“/”与“\/”相同,字符串文本永远不会序列化为“\/”(即使“\/”也必须映射到“\\/”)。

有关更好的解释,请参阅 http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2(向下滚动到“从 JavaScript Literals 到 JSON”)

JSON的痛点之一是缺少日期/时间文本。许多人在第一次遇到JSON时会感到惊讶和失望。对于没有日期/时间文本的简单解释(无论是否令人放心)是JavaScript也从未有过:JavaScript中对日期和时间值的支持完全通过Date对象提供。因此,大多数使用 JSON 作为数据格式的应用程序通常倾向于使用字符串或数字来表示日期和时间值。如果使用字符串,则通常可以期望它采用 ISO 8601 格式。如果使用数字,则该值通常表示自 epoch 以来的通用协调时间 (UTC) 中的毫秒数,其中 epoch 定义为 1970 年 1 月 1 日 (UTC) 的午夜。同样,这只是一个约定,不是JSON标准的一部分。如果要与其他应用程序交换数据,则需要查看其文档,以了解它如何在 JSON 文本中对日期和时间值进行编码。例如,Microsoft 的 ASP.NET AJAX 既不使用上述约定。相反,它将 .NET DateTime 值编码为 JSON 字符串,其中字符串的内容是 /Date(ticks)/,其中 ticks 表示自 epoch (UTC) 以来的毫秒。因此,1989 年 11 月 29 日凌晨 4:55:30,在 UTC 中编码为“\/Date(628318530718)\/”。

一个解决方案是解析它:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

但是,我听说在某个地方有一个设置可以让序列化程序使用语法输出对象。我会试着把它挖出来。DateTimenew Date(xxx)


的第二个参数接受一个函数,其中规定了值在返回之前最初由谁生成。JSON.parse()reviver

下面是一个日期示例:

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

请参阅 JSON.parse() 的文档


答案 2

这是我在Javascript中的解决方案 - 非常像JPot的,但更短(可能更快一点):

value = new Date(parseInt(value.substr(6)));

“value.substr(6)” 取出 “/Date(” 部分, parseInt 函数忽略最后出现的非数字字符。

编辑:我故意省略了基数(解析Int的第二个参数);请参阅下面的评论。另外,请注意,ISO-8601日期优先于这种旧格式 - 因此这种格式通常不应用于新开发。

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

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