我正在创建一个应用程序来创建.ics文件使用iCal4j(1.0.3)应用程序接口,它工作fine.However我遇到了一个关于时区的问题。我已经添加了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 Outlook2010 (14.0.6117.5001) SP1。
有没有人知道iCal mod或者其他方法可以让时区与Microsoft Outlook完全兼容?
或者甚至是其他允许我创建兼容Outlook的.ics文件的api?
发布于 2012-08-18 13:07:28
您是否尝试过仅引用现有的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 )。
发布于 2012-08-09 15:45:36
时区在icalendar中不是隐含的,你应该通过在你的ics文件中使用VTIMEZONE组件来显式命名;参见rfc5545§3.6.5。时区组件(timezone component)
发布于 2012-08-22 08:13:18
我终于能够通过“引用”TZID参数来获得类似的效果,但是按照作者的建议启用OUTLOOK_COMPATIBILITY提示并不起作用。相反,我不得不手动完成此操作:
TzId tzid = new TzId("\"America/Vancouver\"");当然,这感觉更像是黑客攻击,而不是真正的解决方案。也许Fortuna有一个建议来让它工作??
https://stackoverflow.com/questions/11873976
复制相似问题