Outlook将iCalendar UTC日期/时间作为循环事件的浮动处理


Outlook Treating iCalendar UTC Date/Time as Floating for Recurring Events

我正在从基于PHP/Zend框架的日历应用程序中的事件创建一个iCalendar文件。我正在将日期/时间转换为UTC,以避免与它们一起指定时区。如果我导入一个一次性事件,Outlook会正确地解释UTC时间,并将其显示在我的本地时区(东部时间)中。加拿大))。当我导入一个循环事件时,Outlook会忽略日期/时间是UTC格式的事实,并将其视为"浮动"。

这是正确导入的一次性事件:

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点(美国&加拿大),但在Outlook中显示为晚上10点到11点。

我正在阅读iCalendar规范,并发现了这一小段:

"DTSTART"answers"DTEND"属性对或"DTSTART"answers"DURATION"属性对,在iCalendar对象中指定,定义第一个递归的实例。当与递归规则一起使用时,"DTSTART"answers"DTEND"属性必须在本地时间和适当的"VTIMEZONE"日历组件必须是包括在内。有关"VTIMEZONE"日历用法的详细信息组件,参见"VTIMEZONE"日历组件定义。

我可以这样使用date_default_timezone_get():

$data[] = 'DTSTART;TZID=' . date_default_timezone_get()
        . ':' . $date_start;

简单地使该更改修复了问题,但我的ics文件不符合iCalendar,因为我不知道如何根据date_default_timezone_get()的值生成"VTIMEZONE"日历组件。

Z后缀表示UTC时区,而不是'floating'

对于DTSTART和DTEND,将Z去掉。严格来说,日历应用程序应该使用自己的时区加载它。

浮动事件通常只对个人的事情有意义,比如你的例子中的"吃早餐"。永远不要用于可能由不同时区的人共享/查看的事件,因为它们显然不会匹配。

从https://www.rfc-editor.org/rfc/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.