2012-10-12 183 views
4

我想通过ajax加载一些数据并自动解析日期。jquery ajax请求的JSON日期格式

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”(一般为从轨默认to_json),但jQuery的只是把这个字符串。日期需要用什么格式才能将jquery解析为日期?

样本响应:

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

回答

1

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

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

我使用我的JSON日期的全格式的首先是现在日期(“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!"); 
    } 
}); 
5

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

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

你的情况可能是这样的:

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

    row[0] = Date.parse(row[0]); 
} 
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());​ 

EXAMPLE

从一个类似的问题摘自:​​

的Date.parse方法完全依赖于实现(新 日期(字符串)相当于Date.parse(字符串))