Обработка даты jQuery/JSON

У меня проблема с обработкой дат JSON из XML-файла календаря Google. Я извлек .startTime и .endTime и использую jQuery для форматирования этих дат (+ все даты между ними) как ГГГГ-ММ-ДД. Затем я использую отформатированные даты, чтобы добавить цвет фона в ячейки таблицы с соответствующими уникальными идентификаторами (#ГГГГ-ММ-ДД) в моем собственном календаре. Работает нормально, но где-то по пути даты становятся несовпадающими. Я следую процессу:

  • Введите событие в Календаре Google. В качестве тестового события я использовал 25–27 марта 2014 г. (событие на весь день отмечено флажком).
  • Извлеченные данные XML JSON: "gd$when": [{"endTime": "2014-03-28", "startTime": "2014-03-25"

(Итак, я уже запутался, потому что в JSON добавлен дополнительный день к дате окончания моего мероприятия - почему?)

  • Использовал jQuery ниже, чтобы назначить отформатированные даты идентификатору моего собственного Cal. (Спасибо @Ezequiel, который помог мне зайти так далеко - я не силен в jQuery).

    function GCalEvents() {
    
    var calendar_json_url = "https://www.google.com/calendar/feeds/my_email%40googlemail.com/public/full?orderby=starttime&sortorder=ascending&max-results=60&futureevents=true&alt=json"
    
      // Get list of upcoming events formatted in JSON
      jQuery.getJSON(calendar_json_url, function(data){
    
        // Parse and render each event
        jQuery.each(data.feed.entry, function(i, item){
    
            var formatInt = function (i) {
                if (i < 10) return "0" + i;
                return i;
            };
            var format = function (d) {
                var date = d.getDate();
                var month = d.getMonth() + 1;
                var year = d.getFullYear();
                return year + "-" + formatInt(month) + "-" + formatInt(date);
            };
            var getDates = function (start, theend) {
                var current = new Date(start);
                var finish = new Date(theend);
                var result = [];
    
            do {
                current.setDate(current.getDate() + 1);
                result.push(format(current));
            } while (current < finish);
    
                return result;
            };
    
          // Apply background to dates.
            var start = item.gd$when[0].startTime;
            var theend = item.gd$when[0].endTime;
    
            var dates = getDates(start, theend).map(function toId(date) { return "#" + date }).join(",");
            jQuery(dates).removeClass('date-cell').addClass('date-selected');
    
            });
          });
    
    }
    
  • Проверьте календарь, и он покрасил фоны 26, 27, 28 марта, так что конечный эффект заключается в том, что он сдвинул все мое исходное событие GCal на один день вперед, а по отношению к JSON это имеет правильную дату окончания, но неправильную дату начала! Очевидно, я просто хочу, чтобы отображалась правильная дата GCal.

Что я пробовал:

  • var date = d.getDate() -1 ; - But this causes problems with the final day of the month.
    • There are no other jQuery functions interfering.
    • Идентификаторы ячеек таблицы для моего собственного календаря генерируются правильно.

Это связано с часовым поясом?

Я был бы признателен за любую помощь, которую кто-либо может дать.


person theflyingant    schedule 31.01.2014    source источник


Ответы (1)


Из того, что я вижу в ваших «Извлеченных данных XML JSON», изменилась только дата окончания. И то, что я видел раньше. Я считаю, что это связано с тем, что вы назначили мероприятие на целый день. Затем он заканчивается в полночь следующего дня. И это не имеет ничего общего с тем, как он представлен (в данном случае JSON), а скорее с тем, как Google его хранит.

Если вы создаете «нормальное» событие (не весь день), вы должны получить ожидаемую дату.

person fredrik    schedule 31.01.2014
comment
Спасибо за вашу помощь. Установка события как обычно корректирует дату окончания. У вас есть идеи, почему дата начала неверна? (Извините, если я использовал неправильный жаргон в своем OP, JSON для меня новая территория). - person theflyingant; 31.01.2014
comment
Я не пробовал, но это может быть current.setDate(current.getDate() + 1);, который я вижу в теле do. В частности, +1. - person fredrik; 31.01.2014