outlook 中可能出现时区解析错误
Possible timezone parsing error in outlook
我正在尝试确定这是 outlook 的问题。
我正在生成指定事件时区的 ics 文件:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.example.com
X-WR-TIMEZONE:America/Chicago
X-PUBLISHED-TTL:P1W
BEGIN:VEVENT
UID:56bba0729f450
DTSTART;TZID=America/Chicago:20160212T170000
SEQUENCE:0
TRANSP:OPAQUE
DTEND;TZID=America/Chicago:20160212T183000
SUMMARY:Beer-o-clock
CLASS:PUBLIC
DTSTAMP:20160210T144122Z
END:VEVENT
BEGIN:VTIMEZONE
TZID:America/Chicago
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
TZOFFSETFROM:-0600
TZOFFSETTO:-0500
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:CST
TZOFFSETFROM:-0500
TZOFFSETTO:-0600
DTSTART:19701101T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
此邀请有效,但如果您在不同的时区打开它(例如,我在太平洋时区打开它时看到这个)在 Outlook 中它无法识别时区更改。时区更改 是 被其他应用程序识别,例如 mac os 日历或 Google 日历。
当我重新排列日历文件以使 VEVENT
定义位于 VTIMEZONE
定义之后时,它在 outlook 中确实有效:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.example.com
X-WR-TIMEZONE:America/Chicago
X-PUBLISHED-TTL:P1W
BEGIN:VTIMEZONE
TZID:America/Chicago
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
TZOFFSETFROM:-0600
TZOFFSETTO:-0500
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:CST
TZOFFSETFROM:-0500
TZOFFSETTO:-0600
DTSTART:19701101T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:56bba0729f450
DTSTART;TZID=America/Chicago:20160212T170000
SEQUENCE:0
TRANSP:OPAQUE
DTEND;TZID=America/Chicago:20160212T183000
SUMMARY:Beer-o-clock
CLASS:PUBLIC
DTSTAMP:20160210T144122Z
END:VEVENT
END:VCALENDAR
这似乎是 outlook 中的解析错误,但我不太确定。我不知道在不破解供应商代码(我希望不要这样做)的情况下,我对 ics 文件的生成顺序有多少控制权。
这是 outlook 特定的事情还是邀请定义有其他问题?
虽然您可能在 RFC5545/RFC5546 中找不到任何声明 VTIMEZONE 组件必须在 VEVENT 之前的内容,但这些规范中给出的所有示例都按此顺序排列,而且实践显然是让 VTIMEZONE在 VEVENT 之前。
从 iCalendar 消费者方面来看,它也很有意义,因为 VTIMEZONE TZID 在 VEVENT 中被引用。
不循规蹈矩,真是自找麻烦。假设您以其他方式解决了 Outlook 问题,明天您很可能会遇到与另一个客户端的互操作问题。所以你最好修复你的 iCalendar 流。
iCalendar 规范不要求您将 VTIMEZONE
组件放在顶部。但是,当然,人们可以按照自己的选择自由实施规范。
我正在尝试确定这是 outlook 的问题。
我正在生成指定事件时区的 ics 文件:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.example.com
X-WR-TIMEZONE:America/Chicago
X-PUBLISHED-TTL:P1W
BEGIN:VEVENT
UID:56bba0729f450
DTSTART;TZID=America/Chicago:20160212T170000
SEQUENCE:0
TRANSP:OPAQUE
DTEND;TZID=America/Chicago:20160212T183000
SUMMARY:Beer-o-clock
CLASS:PUBLIC
DTSTAMP:20160210T144122Z
END:VEVENT
BEGIN:VTIMEZONE
TZID:America/Chicago
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
TZOFFSETFROM:-0600
TZOFFSETTO:-0500
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:CST
TZOFFSETFROM:-0500
TZOFFSETTO:-0600
DTSTART:19701101T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
此邀请有效,但如果您在不同的时区打开它(例如,我在太平洋时区打开它时看到这个)在 Outlook 中它无法识别时区更改。时区更改 是 被其他应用程序识别,例如 mac os 日历或 Google 日历。
当我重新排列日历文件以使 VEVENT
定义位于 VTIMEZONE
定义之后时,它在 outlook 中确实有效:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:www.example.com
X-WR-TIMEZONE:America/Chicago
X-PUBLISHED-TTL:P1W
BEGIN:VTIMEZONE
TZID:America/Chicago
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
TZOFFSETFROM:-0600
TZOFFSETTO:-0500
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:CST
TZOFFSETFROM:-0500
TZOFFSETTO:-0600
DTSTART:19701101T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:56bba0729f450
DTSTART;TZID=America/Chicago:20160212T170000
SEQUENCE:0
TRANSP:OPAQUE
DTEND;TZID=America/Chicago:20160212T183000
SUMMARY:Beer-o-clock
CLASS:PUBLIC
DTSTAMP:20160210T144122Z
END:VEVENT
END:VCALENDAR
这似乎是 outlook 中的解析错误,但我不太确定。我不知道在不破解供应商代码(我希望不要这样做)的情况下,我对 ics 文件的生成顺序有多少控制权。
这是 outlook 特定的事情还是邀请定义有其他问题?
虽然您可能在 RFC5545/RFC5546 中找不到任何声明 VTIMEZONE 组件必须在 VEVENT 之前的内容,但这些规范中给出的所有示例都按此顺序排列,而且实践显然是让 VTIMEZONE在 VEVENT 之前。 从 iCalendar 消费者方面来看,它也很有意义,因为 VTIMEZONE TZID 在 VEVENT 中被引用。
不循规蹈矩,真是自找麻烦。假设您以其他方式解决了 Outlook 问题,明天您很可能会遇到与另一个客户端的互操作问题。所以你最好修复你的 iCalendar 流。
iCalendar 规范不要求您将 VTIMEZONE
组件放在顶部。但是,当然,人们可以按照自己的选择自由实施规范。