1

我正在创建一个应用程序来使用 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

4 回答 4

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)。

于 2012-08-18T05:07:28.360 回答
0

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

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

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

于 2012-08-22T00:13:18.450 回答
0

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

于 2012-08-09T07:45:36.237 回答
0

它对我有用..每当我生成一个 ical 时,我将其默认为 UTC。Outlook 在内部将 ical 中的 UTC 时间转换为用户时区。甚至在 Thunderbird 和雅虎日历上也试过。

于 2012-09-06T15:03:23.747 回答