Как анализировать даты файлов календаря с помощью JavaScript?

Нам нужно использовать JavaScript в браузере для чтения и анализа файлов календаря (.ics) (также называемых форматами iCal). Я написал специальную функцию для чтения этих значений, а затем использовал функцию JavaScript Date () для создания объекта данных.

Есть ли более простой и лучший способ сделать это? Пожалуйста, посмотрите мою функцию (ниже), ваши комментарии будут приветствоваться.

Типичное значение даты из файла .ics выглядит так:

DTSTART: 20110914T184000Z

Нужно разорвать его на толстой кишке, поэтому:

var strData = 'DTSTART:20110914T184000Z'
var x = strData.indexOf(":");
var strVal = strData.slice(x + 1 );

затем вызовите функцию, которая возвращает объект даты:

var dateObj = calenDate(strVal);

// результирующее значение dateObj: Fri Oct 14 2011 18:40:00 GMT-0400 (восточное летнее время)

Вот функция, которая анализирует дату.

function calenDate(icalStr)  {
    // icalStr = '20110914T184000Z'             
    var strYear = icalStr.substr(0,4);
    var strMonth = icalStr.substr(4,2);
    var strDay = icalStr.substr(6,2);
    var strHour = icalStr.substr(9,2);
    var strMin = icalStr.substr(11,2);
    var strSec = icalStr.substr(13,2);

    var oDate =  new Date(strYear,strMonth, strDay, strHour, strMin, strSec)

return oDate;
}

Я думаю, что что-то не так, потому что месяц неверный.


person TGanoe    schedule 28.12.2011    source источник


Ответы (3)


По какой-то странной причине параметр месяца отсчитывается от нуля (ссылка ).

Измените эту строку в своей функции.

var strMonth = icalStr.substr(4,2);

к этому:

var strMonth = parseInt(icalStr.substr(4,2),10)-1;

См. Рабочую демонстрацию на jsFiddle: http://jsfiddle.net/cTkTQ/

person jessegavin    schedule 28.12.2011
comment
Месяцы отсчитываются от нуля? Спасибо что подметил это! Я не видел этого в RFC 5545. - person TGanoe; 28.12.2011
comment
Извините за комментарий к этому комментарию зомби, но я просто хочу отметить, что это не месяцы в iCal (RFC 5545), отсчитываемые от нуля, а месяцы даты javascript. - person jiroch; 13.12.2019

Несколько более надежный способ разбора дат:

    var parser = XRegExp("^ (?<prefix> [^:;]+       )    # DTSTART/DTEND/DTSTAMP \n\
                            ((:|;TZID=(?<tz>[^:]+):))    # timezone \n\
                            (?<year>   [0-9]{4}     )    # year    \n\
                            (?<month>  [0-9]{2}     )    # month   \n\
                            (?<day>    [0-9]{2}     ) T  # day     \n\
                            (?<hour>   [0-9]{2}     )    # hour    \n\
                            (?<minute> [0-9]{2}     )    # minute  \n\
                            (?<second> [0-9]{2}     )    # second  \n\
                            (?<utc>     Z?          )    # utc", "x");

     parts = parser.exec (d);

     var od = new Date (parseInt (parts.year, 10),
                        parseInt (parts.month, 10) - 1,
                        parseInt (parts.day, 10),
                        parseInt (parts.hour, 10),
                        parseInt (parts.minute, 10),
                        parseInt (parts.second, 10));

Для этого вам потребуется добавить дополнительную (крошечную) зависимость, XRegExp, что в зависимости от на ваши дальнейшие потребности, но это позволяет чистый, легко читаемый парсинг регулярного выражения формата даты в файлах .ics. При этом также учитывается идентификатор часового пояса, если дата не в формате UTC. Я предоставляю вам добавить правильную обработку часовых поясов, а также использование части prefix.

Краткий ответ (как заметил jessegavin), однако, заключается в том, что month-параметр конструктора ожидает число от 0 до 11 (см. Mozilla Developer Network для получения дополнительной информации). Однако parseInt() пытается анализировать ведущие нули как radix 8 (восьмеричное), поэтому вы должны обязательно добавить и radix 10, это будет второй параметр для parseInt(string [, radix]).

person zrvan    schedule 28.12.2011
comment
Хорошо, не нужно было создавать все эти переменные, просто переходит прямо в конструктор Date - person TGanoe; 28.12.2011