鉴于以下JSON日期表示:反序列化客户端AJAX JSON日期
"\/Date(1221644506800-0700)\/"
你如何反序列化到这一点它的JavaScript日期型的形式?
我使用MS AJAX JavaScrioptSerializer尝试如下图所示:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
然而,所有我回来是字面上的日期。
鉴于以下JSON日期表示:反序列化客户端AJAX JSON日期
"\/Date(1221644506800-0700)\/"
你如何反序列化到这一点它的JavaScript日期型的形式?
我使用MS AJAX JavaScrioptSerializer尝试如下图所示:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
然而,所有我回来是字面上的日期。
只要你知道字符串肯定是一个日期,我更喜欢这样做:
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
大数目是标准JS时间
new Date(1221644506800)
星期三2008年9月17日19时41分46秒GMT + 1000(EST)
甲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]);
在ASP.net AJAX反序列化方法所使用的正则表达式寻找看起来像“/日期(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);
对于那些不希望使用微软的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规范并不是非常明确。
Bertrand LeRoy,曾在ASP.NET Atlas/AJAX,described the design of the JavaScriptSerializer DateTime output上工作,并揭示了神秘的领先和尾随正斜杠的起源。他提出这一建议:
运行一个简单的搜索 “\ /日期((\ d +))\ /” 和EVAL之前, “新的日期($ 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 />");
这是非常接近的许多其他的答案:
其实,momentjs支持这种格式,你可以这样做:
var momentValue = moment(value);
momentValue.toDate();
这
你使用jQuery也许一个JavaScript日期格式返回值?查看我的博客文章以自动转换日期,因此您不必手动执行。 http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html – 2010-12-27 15:51:39
请参阅下面的评论。您的博客代码在时代之前的日期失败。 – 2011-11-28 18:16:35