2008-09-17 91 views
35

鉴于以下JSON日期表示:反序列化客户端AJAX JSON日期

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

你如何反序列化到这一点它的JavaScript日期型的形式?

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

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

然而,所有我回来是字面上的日期。

+0

你使用jQuery也许一个JavaScript日期格式返回值?查看我的博客文章以自动转换日期,因此您不必手动执行。 http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html – 2010-12-27 15:51:39

+0

请参阅下面的评论。您的博客代码在时代之前的日期失败。 – 2011-11-28 18:16:35

回答

28

只要你知道字符串肯定是一个日期,我更喜欢这样做:

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

大数目是标准JS时间

new Date(1221644506800) 

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

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]); 
+0

这对我不起作用 – CVertex 2009-09-01 12:13:37

+0

My toJson方法正在将序列化日期吐出为“\/Date(1251795070160)\ /”,您的代码无法解析。我会研究为什么以后,只是在这里发布 – CVertex 2009-09-01 12:21:04

+0

+1来明确JSON值可以是什么,并且这些日期不是其中之一,而是一种自定义格式。 – 2011-09-29 14:20:15

5

在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); 
3

对于那些不希望使用微软的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规范并不是非常明确。

16

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 />"); 

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

  • 使用锚定的RegEx作为Sjoerd Visscher做的 - 不要忘记^和$。
  • 避免string.replace和RegEx上的'g'或'i'选项。 “/ Date(1271389496563)// Date(1271389496563)/”should not work at all。
1

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

var momentValue = moment(value); 

    momentValue.toDate();