How to parse JSON to receive a Date object in JavaScript?

我有以下一段 JSON:

\/Date(1293034567877)\/

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

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

现在我面临的问题是如何用 JavaScript 创建 Date 对象。 我所能找到的就是令人难以置信的正则表达式解决方案(许多包含 bug)。

很难相信没有优雅的解决方案,因为这些都是在 JavaScript 中完成的,我的意思是 JavaScript 代码试图读取 JSON (JSON) ,这应该是一个 JavaScript 代码,现在看来并不是因为 JavaScript 不能在这里做好工作。

我还看到了一些我无法实现的评估解决方案(除了被指出是安全威胁之外)。

真的没有办法做得优雅一点吗?

类似的问题,没有真正的答案:
如何用 GWT 解析 ASP.NET JSON 日期格式

278650 次浏览

有什么问题:

new Date(1293034567877);

这将为我返回“ Wed Dec 22201016:16:07 GMT + 0000(GMT Standard Time)”。

还是你需要把号码从 Json 那里弄出来?

来自 我是 Roy Tinker的答案是:

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

正如他所说: Subr 函数取出“/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构造函数接受的任何类型的 string/int。

日期没有标准的 JSON 表示。你应该按照@jAndy 的建议去做,根本不要序列化 DateTime; 只要发送一个 RFC1123日期字符串 ToString("r")或者一个从 Unix-epoch 开始的秒数,或者其他你可以在 JavaScript 中用来构造 Date的东西。

我没用过。这样的事情。如果你能让它打印出像下面这样的东西,它应该可以工作。

注意,除非您通过其他方式解析 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 ()更加高效和安全,因此预计下一个 ECMAScript 标准中将包含本机 JSON 支持。[6]


链接到 JSON2文件

实例

//
// 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();
}

JSON.parse函数接受一个可选的 DateTime rever 函数:

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

你的约会对象会出现的。

您可以在 JavaScript 中将 JSON 日期转换为普通的日期格式。

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

这个问题的答案是,使用 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 时间实例

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

如果您不想使用第三方脚本,可以使用 < a href = “ http://moment js.com/docs/#/parsing/asp-net-json-date/”rel = “ nofollow”> moment,js 然后您可以使用. format ()将其格式化为您想要的任何格式。

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;
};

//使用此函数

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

正如 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))
}
});

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,但它不工作。角度对待这作为字符串,而不是日期。

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

如果你在 JSON 使用的是 JavaScript 风格的 ISO-8601日期,你可以使用这个来自 MDN:

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

创建 ISO-8601日期字符串:

myDate.toISOString()

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

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

使用 eval 我们将字符串转换为 javascript 代码。然后我们将“/”删除,并将一个正则表达式放入替换函数中。当我们从新开始时,我们的句子将会执行这个:

new Date(1455418800000)

现在,我很久以前就开始使用的一样东西,就是用刻度表示的长值... ... 为什么?嗯,本地化和停止思考如何在每个服务器或每个客户端的日期配置。事实上,我也在数据库中使用它。

也许现在回答这个问题有点晚了,但是对这里的任何人都有帮助。

使用 eval 函数只需删除前面和后面的斜杠即可。

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

产量1970年1月1日星期四00:00:00 GMT-0700(美国山区标准时间)

我遇到了一个外部 API 提供这种格式的日期的问题,有时甚至使用像 /Date(123232313131+1000)/这样的 UTC 差异信息。我能够用下面的代码转换 jsDate对象

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);
}
}