PHP中的ICalendar解析器,支持时区 [英] ICalendar parser in PHP that supports timezones

查看:103
本文介绍了PHP中的ICalendar解析器,支持时区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一个可以解析ICalendar(ICS)文件并正确处理时区的PHP类.

I am looking for a PHP class that can parse an ICalendar (ICS) file and correctly handle timezones.

我已经创建了一个ICS解析器,但是它只能处理PHP已知的时区(例如欧洲/巴黎").

I already created an ICS parser myself but it can only handle timezones known to PHP (like 'Europe/Paris').

不幸的是,由Evolution(Ubuntu的默认日历软件)生成的ICS文件未使用默认时区ID.它导出具有特定时区ID的事件,并导出时区的完整定义:夏令时,重复规则以及所有有关时区的难懂内容.

Unfortunately, ICS file generated by Evolution (default calendar software of Ubuntu) does not use default timezone IDs. It exports events with its a specific timezone ID exporting also the full definition of the timezone: daylight saving dates, recurrence rule and all the hard stuff to understand about timezones.

这对我来说太过分了.由于这对我的女朋友来说只是一个很小的工具,所以我没有时间进一步研究ICalendar规范并亲自创建完整的ICalendar解析器.

This is too much for me. Since it was only a small utility for my girlfriend, I won't have time to investigate further the ICalendar specification and create a full blown ICalendar parser myself.

那么,ICalendar文件格式的PHP中是否有任何已知的实现可以解析时区定义?

So is there any known implementation in PHP of ICalendar file format that can parse timezones definitions?

推荐答案

很可能有很多库可以解析.ics文件,但是我将向您展示一个非常适合我的示例.

Most likely there are a lot of libraries that parse .ics files, but I'll show you one example that works for me quite well.

我使用了这个库: http://www.phpclasses.org/浏览/文件/16660.html

它为您提供了处理各种类型的ICal组件的极大灵活性:VEVENT,VTODO,VJOURNAL,VFREEBUSY,VALARM和VTIMEZONE(您要问的那个).

It gives you a lot of flexibility in handling different types of ICal components: VEVENT, VTODO, VJOURNAL, VFREEBUSY, VALARM, and VTIMEZONE (the one you were asking about).

示例:

<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);

这篇关于PHP中的ICalendar解析器,支持时区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆