我正在寻找一个可以解析ICalendar(ICS)文件并正确处理时区的PHP类。
我自己已经创建了一个ICS解析器,但它只能处理PHP已知的时区(如'Europe / Paris')。
不幸的是,Evolution生成的ICS文件(Ubuntu的默认日历软件)不使用默认时区ID。它使用特定的时区ID导出事件,同时导出时区的完整定义:夏令时,重复规则以及了解时区的所有难题。
这对我来说太过分了。由于它对我的女朋友来说只是一个小工具,我没有时间进一步调查ICalendar规范并自己创建一个完整的ICalendar解析器。
那么在PHP中是否有任何可以解析时区定义的ICalendar文件格式的实现?
答案 0 :(得分:10)
很可能有很多库可以解析.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);