【问题标题】:ICalendar parser in PHP that supports timezones支持时区的 PHP 中的 ICalendar 解析器
【发布时间】:2023-04-07 07:33:01
【问题描述】:

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

我自己已经创建了一个 ICS 解析器,但它只能处理 PHP 已知的时区(如“欧洲/巴黎”)。

很遗憾,Evolution(Ubuntu 的默认日历软件)生成的 ICS 文件不使用默认时区 ID。它使用特定的时区 ID 导出事件,同时导出时区的完整定义:夏令时日期、重复规则以及所有难以理解的有关时区的内容。

这对我来说太多了。因为它只是我女朋友的一个小工具,所以我没有时间进一步研究 ICalendar 规范并自己创建一个成熟的 ICalendar 解析器。

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

【问题讨论】:

  • 我现在正在使用Sabre\vObject

标签: php parsing timezone icalendar


【解决方案1】:

很可能有很多库可以解析 .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);

【讨论】:

  • 谢谢,我会调查的 :)
  • phpclasses.org 要求您注册才能访问下载。我创建了一个publicly accessible mirror,在这个……疯狂的意大利面条代码的许可下行使我的权利。
  • 这个库有文档吗?在我看来,它比 sabre\vObject 更糟糕(文档更少,代码更混乱)...... ☹
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多