How to parse JSON to receive a Date object in JavaScript?
我有以下一段JSON:
1 | \/Date(1293034567877)\/ |
这是此.NET代码的结果:
1 2 3 | var obj = DateTime.Now; var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); serializer.Serialize(obj).Dump(); |
号
现在我面临的问题是如何用JavaScript从中创建日期对象。我能找到的只是难以置信的regex解决方案(许多包含bug)。
很难相信没有优雅的解决方案,因为这都是在javacrip中,我的意思是javascript代码试图读取JSON(javascript对象表示法),这应该是一个javascript代码,而现在看来,这并不是因为javascript在这里做不好。
我还看到了一些我无法使用的评估解决方案(除了被指出是安全威胁)。
真的没有优雅的方式去做吗?
类似的问题没有真正的答案:如何用GWT解析ASP.NET JSON日期格式
parse函数接受可选的datetime恢复函数。您可以使用这样的函数:
1 2 3 4 5 6 7 8 9 10 | dateTimeReviver = function (key, value) { var a; if (typeof value === 'string') { a = /\/Date\((\d*)\)\//.exec(value); if (a) { return new Date(+a[1]); } } return value; } |
。
然后打电话
1 | JSON.parse(somejsonstring,dateTimeReviver) |
你的约会会很顺利的
没有标准的JSON表示日期。你应该按照@jandy的建议来做,而不是序列化一个
Roy Tinker的回答是:
1 | var date = new Date(parseInt(jsonDate.substr(6))); |
号
如他所说:substr函数会去掉"/date"("part",parseint函数会得到整数并忽略末尾的")/"。生成的数字将传递给日期构造函数。
另一种选择是简单地在ASP端正确格式化您的信息,这样JavaScript就可以轻松地读取它。考虑在约会中这样做:
1 | DateTime.Now() |
它应该返回这样的格式:
1 | 7/22/2008 12:11:04 PM |
。
如果您将它传递到javascript
1 | var date = new Date('7/22/2008 12:11:04 PM'); |
变量
1 | Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time) |
。
当然,您可以将这个
如果在JSON中使用JavaScript样式的ISO8601日期,那么可以从MDN中使用它。
1 2 3 | var jsonDate = (new Date()).toJSON(); var backToDate = new Date(jsonDate); console.log(jsonDate); //2015-10-26T07:46:36.611Z |
。
您可以在javascript中将JSON日期转换为普通的日期格式。
1 | var date = new Date(parseInt(jsonDate.substr(6))); |
号
怎么了:
1 | new Date(1293034567877); |
这为我返回"2010年12月22日星期三16:16:07 GMT+0000(GMT标准时间)"。
或者你需要把这个号码从JSON里拿出来?
我知道这是一个非常古老的线索,但我想张贴这篇文章,以帮助那些谁碰上这一点,像我一样。
如果你不在乎使用第三方脚本,你可以使用moment,js然后您可以使用.format()将其格式化为您想要的任何内容。
约会总是一场噩梦。回答你的旧问题,也许这是最优雅的方式:
1 | eval(("new" +"/Date(1455418800000)/").replace(/\//g,"")) |
号
使用eval,我们将字符串转换为javascript代码。然后我们去掉"/",变成replace函数是一个正则表达式。当我们从新开始时,我们的句子会非常有趣:
1 | new Date(1455418800000) |
号
现在,有一件事我很久以前就开始使用了,那就是用记号表示的长值…为什么?好吧,本地化并停止思考如何在每台服务器或每台客户机中配置日期。实际上,我也在数据库中使用它。
也许这个答案很晚了,但可以帮助任何到这里的人。
AngularJS也无法分析.NET JSON日期
我方通过将日期格式化为它的iso 8601字符串表示,而不是直接转储
以下是ASP.NET MVC代码的示例。
1 2 3 | return Json(new { date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format }); |
号
我试过
1 2 3 | return Json(new { date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this }); |
我没有用.NET做这种事。如果你能让它打印出像下面这样的东西,它就可以工作了。
注意,除非您通过其他方式解析JSON字符串,或者只希望用户使用内置JSON解析器的现代浏览器,否则您需要使用JS框架或JSON2将服务器输出的JSON字符串解析为真正的JSON对象。
1 2 3 4 5 6 7 8 | // 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) ); |
。
维基链接
Modern browsers, such as Firefox 3.5 and Internet Explorer 8, include special features for parsing JSON. As native browser support is more efficient and secure than eval(), it is expected that native JSON support will be included in the next ECMAScript standard.[6]
号
链接到JSON2文件
实况示例
1 2 3 4 5 6 7 8 9 10 | 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; }; |
号
我遇到了一个外部API以这种格式提供日期的问题,有时甚至使用像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var val = '/Date(123232311-1000)/'; var pattern = /^\/Date\([0-9]+((\+|\-)[0-9]+)?\)\/$/; var date = null; // Check that the value matches /Date(123232311-1000)/ format if (pattern.test(val)) { var number = val.replace('/Date(', '',).replace(')/', ''); if (number.indexOf('+') >= 0) { var split = number.split('+'); number = parseInt(split[0]) + parseInt(split[1]); } else if (number.indexOf('-') >= 0) { var split = number.split('-'); number = parseInt(split[0]) - parseInt(split[1]); } else { number = parseInt(number); date = new Date(number); } } |
号
正如callum提到的,对我来说,最好的方法是将controller方法改为string,而不是jsonresult"。
1 2 3 4 5 | public string GetValues() { MyObject.DateFrom = DateTime.Now; return JsonConvert.SerializeObject(MyObject); } |
号
从Ajax方法中,您可以这样做
1 2 3 4 5 6 7 8 9 10 11 | $.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函数只需要去掉前面和后面的斜线。
1 2 | var date1 ="/Date(25200000)/" eval("new" + date1.substring(1, date1.length - 1)); |
收益率1970年1月1日星期四00:00:00 GMT-0700(美国山地标准时间)
这个问题的答案是,使用nuget获取json.net,然后在
1 | JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */); |
号
在您的视图中,只需在
1 | JSON.parse(/* Converted JSON object */) |
号
如果是Ajax调用:
1 2 | 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); }); |
号
调用
1 2 3 4 5 6 7 8 9 10 | // // 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(); } |
1 2 3 4 5 6 7 8 9 10 | 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; }; |
号
//使用此函数
1 2 | var objDate=parseJsonDate("\/Date(1443812400000)\/"); alert(objDate); |
号