Как разобрать даты файла календаря с помощью JavaScript? - PullRequest
3 голосов
/ 28 декабря 2011

Нам нужно использовать 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: пт 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;
}

Я думаю, что-то не так, потому что месяц ошибается.

Ответы [ 3 ]

7 голосов
/ 28 декабря 2011

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

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

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

к этому:

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

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

1 голос
/ 28 декабря 2011

Несколько более надежный способ анализа дат будет выглядеть так:

    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]).

0 голосов
/ 18 июня 2016

Это новый пакет (с тестами), который, кажется, работает хорошо: ical-date-parser

Использование

import iCalDateParser from 'ical-date-parser';

iCalDateParser('20140422T233000Z');
...