鑑於以下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