如何解析JSON以在JavaScript中接收Date对象?

时间:2010-12-22 17:13:01

标签: javascript json datetime

我有一段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

17 个答案:

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

Wiki Link

  

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


Link to JSON2 file

Live Example

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