Анализ данных JSON, включая дату, создает неправильный объект Date - PullRequest
1 голос
/ 22 октября 2010

Я делаю вызов ajax с jQuery 1.4.2 с dataType: '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 (data), имеет неверныйобъекты даты, близкие к 1970 году, например, четверг 01 января 23:00:00 по Гринвичу + 0200 (EET) (вставленная форма консоли Chrome)

Я полагаю, что с синтаксическим анализом jSON что-то не такДата объекты для меня. Любая подсказка?

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Ваши даты в формате ISO-8601 . К сожалению, не все браузерные движки JavaScript, включая Chrome, поддерживают этот формат. Смотрите этот вопрос для некоторых деталей:

Поддерживает ли Javascript / EcmaScript3 синтаксический анализ даты ISO8601?

Вам нужно будет проанализировать значение с помощью 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 голосов
/ 01 августа 2013

Библиотека 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();
0 голосов
/ 22 октября 2010

Когда я пытаюсь создать дату со значением 2010-10-25T10:00:00-07:00, я получаю ошибку «Неверная дата».Это искаженная строка даты.

Год 1970 - это раздача того, что синтаксический анализатор работает неправильно.

Возможно, вы можете попытаться вернуть что-то вроде 2010-10-25T10:00:00 GMT-0700

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...