【问题标题】:JSON date format for jquery ajax requestjquery ajax请求的JSON日期格式
【发布时间】:2012-10-03 07:27:51
【问题描述】:

我想通过 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]
  ]
}

【问题讨论】:

    标签: jquery ajax json date


    【解决方案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!");
        }
    });
    

    【讨论】:

      【解决方案2】:

      最好自己解析日期。我在某些浏览器中遇到了问题,这些问题没有像您期望的那样从字符串中解析日期。这是一个用于字符串 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());​
      

      EXAMPLE

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

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

      【讨论】:

        【解决方案3】:

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

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

        在你的情况下,可能是这样的:

        $.each(response.rows, function (idx, row) {
        
          row[0] = Date.parse(row[0]);
        }
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-12
            • 1970-01-01
            • 2016-12-10
            • 1970-01-01
            相关资源
            最近更新 更多