我有一段JSON:
\/Date(1293034567877)\/
这是.NET代码的结果:
var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();
现在我遇到的问题是如何在JavaScript中创建一个Date对象。 我所能找到的是令人难以置信的正则表达式解决方案(许多包含错误)。
很难相信没有优雅的解决方案,因为这完全在JavaScrip中,我的意思是JavaScript代码试图读取JSON(JavaScript Object Notation),这应该是一个JavaScript代码,而且此时它发现它不是因为JavaScript在这里做得不好。
我也看到了一些我无法工作的eval解决方案(除了被指出为安全威胁)。
真的没办法以优雅的方式去做吗?
类似的问题没有真正的答案:
How to parse ASP.NET JSON Date format with GWT
答案 0 :(得分:113)
JSON.parse函数接受可选的DateTime reviver函数。你可以使用这样的函数:
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)
您的日期将会正确显示
答案 1 :(得分:46)
日期没有标准的JSON表示。你应该做@jAndy建议的事情而不是序列化DateTime
;只需发送一个RFC 1123日期字符串ToString("r")
或一个从Unix开始的纪元数字,或者您可以在JavaScript中用来构建Date
的其他内容。
答案 2 :(得分:43)
Roy Tinker here的答案:
var date = new Date(parseInt(jsonDate.substr(6)));
正如他所说: substr函数取出“/ Date(”部分,而parseInt函数获取整数并忽略最后的“)/”。生成的数字将传递到Date构造函数中。
另一个选择是在ASP端简单地格式化您的信息,以便JavaScript可以轻松读取它。考虑为你的日期做这件事:
DateTime.Now()
哪个应该返回这样的格式:
7/22/2008 12:11:04 PM
如果您将此传递给JavaScript Date
构造函数,如下所示:
var date = new Date('7/22/2008 12:11:04 PM');
变量date
现在保存此值:
Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)
当然,您可以将此DateTime
对象格式化为JS Date
构造函数接受的任何类型的字符串/ int。
答案 3 :(得分:15)
如果您在JSON中使用JavaScript样式ISO8601日期,则可以使用此MDN
var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
答案 4 :(得分:5)
您可以在JavaScript中将JSON日期转换为普通日期格式。
var date = new Date(parseInt(jsonDate.substr(6)));
答案 5 :(得分:5)
出了什么问题:
new Date(1293034567877);
这对我来说是“2010年12月22日格林尼治标准时间+格林威治标准时间00:00(格林尼治标准时间标准时间)格林威治标准时间12:16:07”。
或者你需要从json中获取数字吗?
答案 6 :(得分:2)
我知道这是一个非常古老的帖子,但我希望发布这个帖子来帮助那些像我一样碰到这个的人。
如果您不关心使用第三方脚本,可以使用moment,js 然后你可以使用.format()将它格式化为你想要的任何东西。
答案 7 :(得分:2)
日期永远是一场噩梦。回答你的旧问题,也许这是最优雅的方式:
eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))
使用eval,我们将字符串转换为javascript代码。然后我们删除“/”,进入replace函数是一个正则表达式。当我们从新开始时,我们的句子就会超越这个:
new Date(1455418800000)
现在,我很久以前开始使用的一件事是用刻度表示的长值...为什么?好吧,本地化并停止思考如何在每个服务器或每个客户端配置日期。事实上,我也在数据库中使用它。
这个答案也许已经很晚了,但可以帮助任何人来到这里。
答案 8 :(得分:1)
AngularJS无法解析.NET JSON日期/Date(xxxxxxxxxxxxx)/
字符串..
我通过将日期格式化为ISO 8601字符串表示而不是直接转储Date
对象来解决此问题...
以下是ASP.NET MVC代码示例..
return Json(new {
date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});
我尝试了RFC 1123
但它不起作用.Angular将此视为字符串而不是日期。
return Json(new {
date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
答案 9 :(得分:0)
这个问题的答案是,使用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
后,您可以将JSON日期放入new Date
实例,因为JsonConvert
会创建正确的ISO时间实例
答案 10 :(得分:0)
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;
};
答案 11 :(得分:0)
正如Callum所说,对我来说,最好的方法是将Controller方法改为字符串而不是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))
}
});
答案 12 :(得分:0)
我没有使用.Net这样的事情。如果你能够打印出类似下面的东西,它应该可以工作。
注意,除非您通过其他方式解析JSON 字符串,或者只希望用户拥有带有内置JSON解析器的现代浏览器,否则您需要使用JS框架或JSON2来解析服务器将JSON字符串输出到真正的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)包含用于解析JSON的特殊功能。由于本机浏览器支持比eval()更高效和安全,因此预计本机JSON支持将包含在下一个ECMAScript标准中。[6]
答案 13 :(得分:0)
使用eval函数只需删除正面和背面的正斜杠。
var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));
产生于1970年1月1日1970:00 00:00:00 GMT-0700(美国山地标准时间)
答案 14 :(得分:0)
我遇到了一个外部API以这种格式提供日期的问题,有时甚至使用诸如1] "TV och vara med kompisar."
2] "Jobba på kompi huset"
3] "Ta det lugnt, umgå med kompisar."
4] "Umgås med kompisar, vänner"
5] "kolla anim med kompiserna"
之类的UTC差异信息。我可以使用以下代码将它变成js /Date(123232313131+1000)/
对象
Date
答案 15 :(得分:-1)
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;
};
//使用此功能
var objDate=parseJsonDate("\/Date(1443812400000)\/");
alert(objDate);
答案 16 :(得分:-1)
//
// 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();
}