Я ищу PHP-класс, который может анализировать файл ICalendar (ICS) и правильно обрабатывать временные интервалы.
Я уже создал собственный синтаксический анализатор ICS, но он может обрабатывать только часовые пояса, известные PHP (например, «Европа / Париж»).
К сожалению, ICS-файл, созданный Evolution (программное обеспечение календаря по умолчанию для Ubuntu), не использует идентификаторы часовых поясов по умолчанию. Он экспортирует события со своим конкретным идентификатором часового пояса, экспортирующим также полное определение часового пояса: даты летнего времени, правило повторения и все тяжелые вещи, чтобы понять о часовых поясах.
Это слишком для меня. Поскольку это была лишь небольшая утилита для моей подруги, у меня не будет времени на дальнейшее изучение спецификации ICalendar и создание полномасштабного анализатора ICalendar.
Итак, есть ли какая-либо известная реализация в PHP файла формата ICalendar, которая может анализировать определения часовых поясов?
Скорее всего, существует множество библиотек, которые анализируют файлы .ics, но я покажу вам один пример, который хорошо работает для меня.
Я использовал эту библиотеку: http://www.phpclasses.org/browse/file/16660.html
Это дает вам большую гибкость при работе с различными типами компонентов ICal: VEVENT, VTODO, VJOURNAL, VFREEBUSY, VALARM и VTIMEZONE (тот, о котором вы просили).
Пример:
<pre><?php // // Open library // require_once( "iCalcreator.class.php" ) ; // // Demo ICal file contents // $string = <<<EOS BEGIN:VCALENDAR VERSION:2.0 PRODID:-//hacksw/handcal//NONSGML v1.0//EN BEGIN:VTIMEZONE TZID:US-Eastern LAST-MODIFIED:19870101T000000Z BEGIN:STANDARD DTSTART:19971026T020000 RDATE:19971026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:EST END:STANDARD BEGIN:DAYLIGHT DTSTART:19971026T020000 RDATE:19970406T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:EDT END:DAYLIGHT END:VTIMEZONE END:VCALENDAR EOS ; // // There is no direct string parsing functionality, // so first create a temporary file // $filename = tempnam( ".", "" ) ; $f = fopen($filename,"w") ; fwrite( $f, $string ); fclose($f); // // ... parse it into an object // $var = new vcalendar(); $var->parse($filename); var_dump( $var ); $event = $var->components[0] ; var_dump( $event->createDtstamp() ); // // ... and finally remove all temporary data. // unlink($filename);