2010-10-22 84 views
1

我使用jQuery 1.4.2與dataType:'json'進行ajax調用。解析包含日期的JSON數據創建錯誤的日期對象

  $.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"}]} 

,但JSON對象jQuery的格式,我(的console.log(數據),有錯誤的日期對象是接近1970年,像 週四1970年1月1日23:00:00 GMT + 0200(EET)(粘貼形式Chrome的控制檯)

我想有創造Date對象我。任何線索出毛病了JSON解析?

回答

0

當我嘗試創建一個具有價值2010-10-25T10:00:00-07:00我約會得到一個「Invalid Date」錯誤,這是一個格式錯誤的日期字符串

1970年的一年是解析器無法正常工作的一個漏洞。

也許你可以嘗試像2010-10-25T10:00:00 GMT-0700

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); 
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();