iCal4j时区与Microsoft Outlook时区不兼容?

时间:2012-08-08 22:13:13

标签: outlook timezone icalendar ical4j

我正在创建一个使用iCal4j(1.0.3)api创建.ics文件的应用程序,它运行正常。但是我遇到了时区的问题。我添加了ZoneInfoOutlook(1.0.2)库并一直使用它来创建我的.ics文件。但是,Outlook无法识别标准时区。例如,当我生成这个:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Ben Fortuna//iCal4j 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTAMP:20120808T211508Z
DTSTART;TZID=America/New_York:20120808T020000
DTEND;TZID=America/New_York:20120808T180000
SUMMARY:NewYork Event
LOCATION:Manhattan
DESCRIPTION:This is a test Description
TZID:America/New_York
END:VEVENT
BEGIN:VTIMEZONE
TZID:America/New_York
TZURL:http://tzurl.org/zoneinfo-outlook/America/New_York
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
END:VCALENDAR  

Outlook无法识别时区。经过一些实验,我发现稍微修改文件后,将America / New_York更改为东部标准时间,Outlook会完美地读取时区。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Ben Fortuna//iCal4j 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTAMP:20120808T211508Z
DTSTART;TZID="Eastern Standard Time":20120808T020000
DTEND;TZID="Eastern Standard Time":20120808T180000
SUMMARY:NewYork Event
LOCATION:Manhattan
DESCRIPTION:This is a test Description
TZID:Eastern Standard Time
END:VEVENT
BEGIN:VTIMEZONE
TZID:Eastern Standard Time
X-LIC-LOCATION:Eastern Standard Time
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
END:VCALENDAR

判断此示例,Outlook对其时区使用非标准标签 我目前正在测试Microsoft Outlook 2010(14.0.6117.5001)SP1。

是否有人知道iCal mod或某种工作方式允许时区与Microsoft Outlook完全兼容?

或者甚至是另一个允许我创建与Outlook兼容的.ics文件的API?

4 个答案:

答案 0 :(得分:1)

您是否尝试过引用现有的TZID参数(即不将其更改为“东部标准时间”)?例如:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Ben Fortuna//iCal4j 1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTAMP:20120808T211508Z
DTSTART;TZID="America/New_York":20120808T020000
DTEND;TZID="America/New_York":20120808T180000
...

在ical4j中,我们可以引用标识符(例如,如果启用了OUTLOOK_COMPATIBILITY提示),但实际更改标识符有点困难。

尽管您可以在自己的代码中执行此操作,即从注册表中检索时区,获取基础VTimeZone对象并替换TZID参数(但可能需要更改ical4j以在输出时引用TZID)。

答案 1 :(得分:0)

时区在icalendar中不是隐含的,您应该通过在ics文件中使用VTIMEZONE组件使名称显式; 见rfc5545§3.6.5。时区组件(timezone component)

答案 2 :(得分:0)

我终于能够通过“引用”TZID参数来获得类似工作,但是正如作者所建议的那样启用OUTLOOK_COMPATIBILITY提示不起作用。相反,我必须手动执行此操作:

TzId tzid = new TzId("\"America/Vancouver\"");

当然,这感觉更像是黑客,而不是真正的解决方案。也许Fortuna有建议让这个工作?

答案 3 :(得分:0)

它适用于我..无论何时我生成一个ical我默认它为UTC。 Outlook在内部将UTC中的UTC时间转换为用户时区。甚至在Thunderbird和雅虎日历上都尝试过。