【问题标题】:Outlook Treating iCalendar UTC Date/Time as Floating for Recurring EventsOutlook 将 iCalendar UTC 日期/时间视为重复事件的浮动
【发布时间】:2011-10-04 14:02:37
【问题描述】:

我正在从基于 PHP/Zend 框架的日历应用程序中的事件创建 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 点,但在 Outlook 中显示为晚上 10 点到晚上 11 点。

【问题讨论】:

    标签: php zend-framework outlook utc icalendar


    【解决方案1】:

    我正在阅读 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”日历组件。

    【讨论】:

      【解决方案2】:

      Z 后缀表示 UTC 时区,而不是“浮动”

      对于 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. 
      

      【讨论】:

      • 是的,这就是 Outlook 的行为让我感到困惑的原因。我用 UTC 指定日期,但它被视为当地时间。我不希望它漂浮。
      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多