如何parsingJSON在JavaScript中接收Date对象?

我有以下一块JSON:

\/Date(1293034567877)\/ 

这是这个.NET代码的结果:

 var obj = DateTime.Now; var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); serializer.Serialize(obj).Dump(); 

现在我面临的问题是如何从JavaScript中创build一个Date对象。 所有我能find的是令人难以置信的正则expression式解决scheme(许多包含错误)。

很难相信没有优雅的解决scheme,因为这一切都在JavaScrip中,我的意思是JavaScript代码尝试阅读本应该是JavaScript代码的JSON(JavaScript对象表示法),现在事实certificate这不会导致JavaScript不能在这里做好工作。

我也看到了一些我无法工作的eval解决scheme(除了被指出为安全威胁之外)。

真的没有办法以优雅的方式做到这一点?

类似的问题没有真正的答案:
如何parsing与GWT的ASP.NET JSONdate格式

没有标准的dateJSON表示。 你应该做什么@jAndybuild议,而不是序列化一个DateTime的; 只需发送一个RFC 1123的datestringToString("r")或者一个来自Unix时代的秒数,或者其他可以在JavaScript中使用的东西来构造Date

JSON.parse函数接受一个可选的DateTime reviver函数。 你可以使用这样的function:

 dateTimeReviver = function (key, value) { var a; if (typeof value === 'string') { a = /\/Date\((\d*)\)\//.exec(value); if (a) { return new Date(+a[1]); } } return value; } 

然后打电话

 JSON.parse(somejsonstring,dateTimeReviver) 

而你的date会出来的权利

Roy Tinker的这个答案在这里 :

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

正如他所说: substr函数取出“/ Date(”部分,parseInt函数获取整数,并在最后忽略“)/”。 生成的数字被传递给Date构造函数。

另一个select是在ASP端简单地格式化信息,以便JavaScript可以轻松读取它。 考虑为你的date做这个:

 DateTime.Now() 

哪个应该返回一个这样的格式:

 7/22/2008 12:11:04 PM 

如果你把这个传递给一个如下所示的JavaScript Date构造函数:

 var date = new Date('7/22/2008 12:11:04 PM'); 

variablesdate现在保存这个值:

 Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time) 

当然,您可以将此DateTime对象格式化为JS Date构造函数接受的任何types的string/ int。

有什么问题:

 new Date(1293034567877); 

这对我来说“Wed Dec 22 2010 16:16:07 GMT + 0000(GMT标准时间)”。

或者你需要从JSON中获取数字吗?

如果您在JSON中使用JavaScript风格的ISO8601date,则可以从MDN中使用此date

 var jsonDate = (new Date()).toJSON(); var backToDate = new Date(jsonDate); console.log(jsonDate); //2015-10-26T07:46:36.611Z 

您可以在JavaScript中将JSONdate转换为正常的date格式。

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

date总是一场噩梦。 回答你的老问题,也许这是最优雅的方式:

 eval(("new " + "/Date(1455418800000)/").replace(/\//g,"")) 

与eval我们将我们的string转换为JavaScript代码。 然后我们删除“/”,进入replace函数是一个正则expression式。 当我们开始新的话,我们的句子将会超越这个:

 new Date(1455418800000) 

现在,我很久以前开始使用的一件事就是用剔号表示长期的价值…为什么? 以及本地化,并停止在每个服务器或每个客户端如何configurationdate。 实际上,我也在数据库中使用它。

这个答案也许是相当晚了,但可以帮助任何人在这里。

我知道这是一个非常古老的线程,但我希望发布这个帮助那些碰到这个像我一样的人。

如果你不关心使用第三方脚本,你可以使用moment,js然后你可以使用.format()格式化它到任何你想要的。

AngularJS无法parsing.NET JSONdate/Date(xxxxxxxxxxxxx)/string

我侧通过格式化date格式化它的ISO 8601string表示,而不是直接转储Date对象…

这里是一个ASP.NET MVC代码示例

 return Json(new { date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format }); 

我试过RFC 1123但它不工作.. Angular把它当作string而不是Date。

 return Json(new { date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this }); 

我没有使用.Net这样的事情。 如果你能得到它打印如下所示的东西,它应该工作。

请注意,除非通过其他方式parsing该JSON string ,或者只希望用户使用内置JSONparsing器的现代浏览器,则需要使用JS框架或JSON2将服务器输出的JSONstringparsing为真正的JSON目的。

 // JSON received from server is in string format var jsonString = '{"date":1251877601000}'; //use JSON2 or some JS library to parse the string var jsonObject = JSON.parse( jsonString ); //now you have your date! alert( new Date(jsonObject.date) ); 

维基链接

现代浏览器(如Firefox 3.5和Internet Explorer 8)包含用于parsingJSON的特殊function。 由于本地浏览器支持比eval()更高效,更安全,所以预计本地JSON支持将包含在下一个ECMAScript标准中[6]。


链接到JSON2文件

现场示例

这个问题的答案是,使用nuget来获取JSON.NET,然后在你的JsonResult方法中使用这个:

 JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */); 

在你的视图里简单的在javascript做这个:

 JSON.parse(/* Converted JSON object */) 

如果是ajax调用:

 var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"}); request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); }); 

一旦JSON.parse被调用,你可以把JSONdate放入一个new Date实例,因为JsonConvert创build一个合适的ISO时间实例

正如Callum提到的,对我而言,最好的方法是将Controller方法更改为string,而不是JsonResult“。

 public string GetValues() { MyObject.DateFrom = DateTime.Now; return JsonConvert.SerializeObject(MyObject); } 

从ajax方法你可以做这样的事情

  $.ajax({ url: "/MyController/GetValues", type: "post", success: function (data) { var validData = JSON.parse(data); //if you are using datepicker and you want set a format $("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom))); // if you want the date as returned $("#DateFrom").val(new Date(validData.DateFrom)) } }); 

使用eval函数工作只需要删除正面和反面的正斜杠。

 var date1 = "/Date(25200000)/" eval("new " + date1.substring(1, date1.length - 1)); 

产量Thu Jan 01 1970 00:00:00 GMT-0700(美国标准时间)

 // // formats a .net date into a javascript compatible date // function FormatJsonDate(jsonDt) { var MIN_DATE = -62135578800000; // const var date = new Date(parseInt(jsonDt.substr(6, jsonDt.length-8))); return date.toString() == new Date(MIN_DATE).toString() ? "" : (date.getMonth() + 1) + "\\" + date.getDate() + "\\" + date.getFullYear(); } 
 function parseJsonDate(jsonDate) { var fullDate = new Date(parseInt(jsonDate.substr(6))); var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth; var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate; var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear(); return currentDate; }; 
 function parseJsonDate(jsonDate) { var fullDate = new Date(parseInt(jsonDate.substr(6))); var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth; var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate; var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear(); return currentDate; }; 

//使用此function

 var Date=parseJsonDate("\/Date(1443812400000)\/"); alert(Date);