5

我想通过 ajax 加载一些数据并自动解析日期。

var url = "http://example.com/report_containing_dates.json"
jQuery.getJSON(url, function(data_containing_dates_and_strings){
  console.log(date);
});

我的 json 中的日期格式是“2012-09-28”(rails to_json 的默认格式),但 jQuery 只是将其视为一个字符串。日期需要采用什么格式才能让 jquery 将其解析为日期?

示例响应:

{
  "columns": [
    ["date", "Date"],
    ["number", "active_users"],
  ],
  "rows": [
    ["2012-09-28", 120, 98, 60],
    ["2012-09-29", 127, 107, 63]
  ]
}
4

4 回答 4

6

如何格式化日期字符串并不重要。JSON 方法永远不会自动将其转换为Date对象。JSON 仅支持以下基本类型:NumberStringBooleanArray和. (http://en.wikipedia.org/wiki/JSON)Objectnull

您必须自己将这些日期字符串转换为Date对象。

在您的情况下,可能类似于:

$.each(response.rows, function (idx, row) {

  row[0] = Date.parse(row[0]);
}
于 2012-10-12T13:23:13.643 回答
3

使用Date.parse,它将从字符串转换为日期。

于 2012-10-12T13:10:28.550 回答
1

好的,这比预期的要困难得多,但我确实有一个解决方案。

我采用的方法是在 ajax 请求中请求自定义数据类型,然后实现自定义转换器。

首先,我在 json 中用于日期的格式现在是 date("yyyy-mm-dd"),原始示例如下所示:

{
  "columns": [
    ["date", "Date"],
    ["number", "active_users"],
  ],
  "rows": [
    ["date(2012-09-28)", 120, 98, 60],
    ["date(2012-09-29)", 127, 107, 63]
  ]
}

然后,我注册了一个转换器,将文本转换为名为 json_with_dates 的自定义数据类型。正则表达式用于搜索日期格式并用语句替换它们以创建日期对象。然后使用 eval 构造 json。

jQuery.ajaxSetup({
  converters: {
    "text json_with_dates": function( text ) {

      var with_dates = text.replace(/\"date\(([^)]*)\)\"/g, function(a, date){
        var dateParts = date.split("-");
        return "new Date(" + dateParts[0] + "," + dateParts[1] + "," + dateParts[2] + ")";
      });

      var converted = eval("(" + with_dates + ")");
      return converted;
    }
  }
});

然后我为自定义数据类型发出 ajax 请求:

$.ajax({
    url: div.data('chart'),
    dataType: 'json_with_dates',
    success: function(data_including_dates){
      console.log("win!");
    }
});
于 2012-10-12T14:57:27.923 回答
0

最好自己解析日期。我在某些浏览器中遇到了一些问题,它们没有像您期望的那样从字符串中解析日期。这是一个用于字符串的快速原型2012-09-28

String.prototype.parseDate = function(){
     var date = this.split("-");
     var yyyy = date[0];
     var mm = date[1];
     var dd = date[2];

     date = new Date(yyyy,mm,dd);
     date.setMonth(date.getMonth()-1); // since Months are 0 based
     return date;
}

console.log(data.rows[0][0].parseDate());
console.log(data.rows[1][0].parseDate());​

例子

取自一个类似的问题:IE JavaScript date parsing error

Date.parse 方法完全依赖于实现(new Date(string) 等价于 Date.parse(string))

于 2012-10-12T13:45:55.543 回答