36

给定以下 JSON 日期表示:

"\/Date(1221644506800-0700)\/"

您如何将其反序列化为它的 JavaScript 日期类型形式?

我尝试使用 MS AJAX JavaScrioptSerializer,如下所示:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

但是,我得到的只是文字字符串日期。

4

7 回答 7

30

如果您知道字符串绝对是我更喜欢这样做的日期:

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
于 2009-06-06T05:51:51.757 回答
18

从事 ASP.NET Atlas/AJAX 工作的 Bertrand LeRoy描述了 JavaScriptSerializer DateTime 输出的设计,并揭示了神秘的前斜线和后斜线的起源。他提出了这个建议:

运行一个简单的搜索 "\/Date((\d+))\/" 并在 eval 之前替换为 "new Date($1)" (但在验证之后)

我将其实现为:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

这与许多其他答案非常接近:

  • 像 Sjoerd Visscher 那样使用锚定的正则表达式——不要忘记 ^ 和 $。
  • 避免使用 string.replace,以及 RegEx 上的“g”或“i”选项。“/Date(1271389496563)//Date(1271389496563)/”根本不应该工作。
于 2010-04-16T16:25:15.240 回答
11

JSON 值是字符串、数字、对象、数组、true、false 或 null。所以这只是一个字符串。没有官方的方式来表示 JSON 中的日期。此语法来自 asp.net ajax 实现。其他人使用 ISO 8601 格式。

你可以像这样解析它:

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
于 2008-09-17T12:07:23.743 回答
6

ASP.net AJAX 反序列化方法中使用的正则表达式查找看起来像“/Date(1234)/”的字符串(字符串本身实际上需要包含引号和斜杠)。要获得这样的字符串,您需要转义引号和反斜杠字符,因此创建字符串的 javascript 代码看起来像“\”\/Date(1234)\/\""。

这将起作用。

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

这有点奇怪,但我发现我必须序列化一个日期,然后序列化从该日期返回的字符串,然后在客户端反序列化一次。

像这样的东西。

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);
于 2009-01-09T16:59:54.710 回答
3

对于那些不想使用 Microsoft Ajax 的人,只需在字符串类中添加一个原型函数即可。

例如

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

不想使用评估?尝试一些简单的事情,比如

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

作为旁注,我曾经认为微软使用这种格式是在误导。但是,在定义一种在 JSON 中描述日期的方式时,JSON 规范并不是很清楚。

于 2009-10-29T22:32:43.080 回答
2

实际上,momentjs 支持这种格式,你可以这样做:

    var momentValue = moment(value);

    momentValue.toDate();

这将返回 javascript 日期格式的值

于 2016-12-28T18:26:28.667 回答
1

大数字是标准的JS时间

new Date(1221644506800)

2008 年 9 月 17 日星期三 19:41:46 GMT+1000 (EST)

于 2008-09-17T11:41:48.377 回答