我正在创建一个应用程序来使用 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 无法识别时区。 经过一些实验,我发现在稍微修改文件,将美国/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?
您是否尝试过仅引用现有的 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)。
我终于能够通过"引用"TZID 参数来获得类似的工作方式,但正如作者建议的那样,启用OUTLOOK_COMPATIBILITY提示不起作用。相反,我必须手动执行此操作:
TzId tzid = new TzId(""America/Vancouver"");
当然,这感觉更像是黑客攻击,而不是真正的解决方案。也许财神有一个建议来让它工作??
它对我有用..每当我生成一个 ical 时,我都会默认为 UTC。Outlook 在内部将 UTC 时间转换为用户时区。甚至在Thunderbird和yahoo日历上尝试过。
icalendar中没有隐式,您应该通过在ics文件中使用VTIMEZONE组件来明确名称;参见 RFC5545 § 3.6.5。 时区组件(时区组件)