如何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);