我正在基于PHP / Zend Framework的日历应用程序中的事件中创建iCalendar文件。我正在将日期/时间转换为UTC,以避免与它们一起指定时区。如果我导入一次性事件,Outlook会正确解释UTC时间并将其显示在我当地时区(美国东部时间(美国和加拿大))。当我导入定期事件时,Outlook忽略了日期/时间以UTC为单位并将其视为“floating”的事实。
这是正确导入的一次性事件:
BEGIN:VCALENDAR
PRODID:My Calendar Application
VERSION:2.0
METHOD:PUBLISH
BEGIN:VEVENT
UID:EVENT-91@WWW.DOMAIN.COM
DTSTAMP:20110713T143920Z
DTSTART:20110713T110000Z
DTEND:20110713T120000Z
SUMMARY:iCalendar Breakfast
DESCRIPTION:Eat more breakfast!
CATEGORIES:Meals
END:VEVENT
END:VCALENDAR
这是无法正确导入的定期事件:
BEGIN:VCALENDAR
PRODID:My Calendar Application
VERSION:2.0
METHOD:PUBLISH
BEGIN:VEVENT
UID:EVENT-82@WWW.DOMAIN.COM
DTSTAMP:20110713T142549Z
DTSTART:20110711T220000Z
DTEND:20110711T230000Z
SUMMARY:iCalendar Dinner
DESCRIPTION:This maps to the iCalendar DESCRIPTION field.
CATEGORIES:Meals
RRULE:FREQ=DAILY;UNTIL=20110715T230000Z;INTERVAL=1
END:VEVENT
END:VCALENDAR
东部时间(美国和加拿大)的时间应该是下午6点到晚上7点,但是在展望中显示为晚上10点到晚上11点。
答案 0 :(得分:3)
我正在阅读iCalendar规范,并找到this little paragraph:
“DTSTART”和“DTEND”属性对或“DTSTART”和“DURATION” 属性对,在iCalendar对象中指定,定义第一个 复发的例子。与重复规则一起使用时, 必须在当地时间和时间指定“DTSTART”和“DTEND”属性 适当的“VTIMEZONE”日历组件必须是 包括在内。有关“VTIMEZONE”日历使用的详细信息 组件,请参阅“VTIMEZONE”日历组件定义。
我能够像这样使用date_default_timezone_get()
:
$data[] = 'DTSTART;TZID=' . date_default_timezone_get()
. ':' . $date_start;
简单地进行更改可以解决问题,但我的ics
文件不符合iCalendar,因为我不知道如何根据date_default_timezone_get()
的值生成“VTIMEZONE”日历组件。 / p>
答案 1 :(得分:0)
Z后缀表示UTC时区,而不是“浮动”
对于DTSTART和DTEND,请关闭Z.然后严格来说,日历应用程序应该使用自己的时区加载它。
根据你的例子,浮动事件对于像“吃早餐”这样的个人事物来说只是有意义的。永远不会用于可能由不同时区的人共享/观看的事件,因为它们显然不会匹配。
来自http://tools.ietf.org/html/rfc5545
带有本地时间表的日期只是一个DATE-TIME值 不包含UTC指示符也不引用时间 区。例如,以下代表1998年1月18日 晚上11点:
19980118T230000
DATE-TIME values of this type are said to be "floating" and are
not bound to any time zone in particular. They are used to
represent the same hour, minute, and second value regardless of
which time zone is currently being observed. For example, an
event can be defined that indicates that an individual will be
busy from 11:00 AM to 1:00 PM every day, no matter which time zone
the person is in.