给出以下JSON日期表示:
"\/Date(1221644506800-0700)\/"
如何将其反序列化为JavaScript日期类型表单?
我尝试过使用MS AJAX JavaScrioptSerializer,如下所示:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
但是,我得到的只是文字字符串日期。
答案 0 :(得分:28)
如果你知道字符串肯定是我喜欢这样做的日期:
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
答案 1 :(得分:16)
Bertrand LeRoy,曾参与ASP.NET Atlas / AJAX,described the design of the JavaScriptSerializer DateTime output并揭示了神秘的前导和尾随斜线的起源。他提出了这个建议:
在eval之前运行一个简单的搜索“\ / Date((\ d +))\ /”并替换为“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 />");
这与其他许多答案非常接近:
答案 2 :(得分:10)
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]);
答案 3 :(得分:5)
ASP.net AJAX deserialize方法中使用的正则表达式查找看起来像“/ 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);
答案 4 :(得分:3)
对于那些不想使用Microsoft Ajax的人,只需将原型函数添加到字符串类中。
E.g。
String.prototype.dateFromJSON = function () {
return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};
不想使用eval?尝试像
这样简单的事情var date = new Date(parseInt(jsonDate.substr(6)));
作为旁注,我曾经认为微软使用这种格式会产生误导。但是,在定义用JSON描述日期的方法时,JSON规范并不十分清楚。
答案 5 :(得分:2)
实际上,momentjs支持这种格式,您可以执行以下操作:
var momentValue = moment(value);
momentValue.toDate();
以javascript日期格式返回值
答案 6 :(得分:1)
大数字是标准的JS时间
new Date(1221644506800)
2008年9月17日星期三19:41:46 GMT + 1000(EST)