我正在创建一个使用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?
答案 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和雅虎日历上都尝试过。