解析包含日期的JSON数据会创建错误的Date对象

时间:2010-10-22 17:31:41

标签: javascript jquery json datetime

我使用带有dataType:'json'的jQuery 1.4.2进行ajax调用。

          $.ajax({
          url: url_with_json_formated_response,
          data: jsonOptions, 
          dataType: 'json',
          error: function(XMLHttpRequest, textStatus, errorThrown){
            alert('unable to get data, error:' + textStatus);
          },
          success: function(data) {
             console.log(data);

          });

如果我查看xhr响应,我会得到以下结果。

{"events":[{"start":"2010-10-25T10:00:00-07:00","label_color":"","kind":"availability","end":"2010-10-25T20:00:00-07:00","recurrence":"monday","body":"some body text","title":"some title text","id":"1492"}]}

但是,jquery为我格式化的json对象(console.log(data),有错误的日期对象,接近1970年,就像 1970年1月1日星期四23:00:00 GMT + 0200(EET)(粘贴形式的铬控制台)

我认为为我创建Date对象的jSON解析有问题。任何线索?

3 个答案:

答案 0 :(得分:1)

您的日期在ISO-8601 format。不幸的是,并非所有浏览器的JavaScript引擎(包括Chrome)都支持此格式。有关详细信息,请参阅此问题:

Does Javascript/EcmaScript3 support ISO8601 date parsing?

您需要parse the value using JavaScript,我已经使用您的数据使用下面此链接背后的代码包含了一个示例:

var json = {"events":[{"start":"2010-10-25T10:00:00-07:00","label_color":"","kind":"availability","end":"2010-10-25T20:00:00-07:00","recurrence":"monday","body":"some body text","title":"some title text","id":"1492"}]};

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

var start = new Date();
start.setISO8601('2010-10-25T10:00:00-07:00');

alert(start);

答案 1 :(得分:0)

当我尝试使用值2010-10-25T10:00:00-07:00创建日期时,出现“无效日期”错误。这是一个格式错误的日期字符串。

1970年的一年是解析器无法正常工作的赠品。

也许您可以尝试返回2010-10-25T10:00:00 GMT-0700

之类的内容

答案 2 :(得分:0)

moment.js非常擅长以各种格式解析日期,并使用ISO8601作为默认值。它适用于所有浏览器。您可以像这样使用它:

var m = moment("2010-10-25T10:00:00-07:00");

// example of re-formatting it as a string
var s = m.format("MM/DD/YYYY h:mm:ss a");

// example of getting back to a Date object
var date = m.toDate();