我正在研究用C ++编写的iCal解析器。在这个上下文中,我注意到了几个由Thunderbird生成的事件,我的解析器无法正确解析。
以下是其中一项活动的示例:
BEGIN:VEVENT
CREATED:20170111T221139Z
LAST-MODIFIED:20170111T221145Z
DTSTAMP:20170111T221145Z
UID:882f4c15-03e9-451c-bf4f-b3422ed8ef54
RDATE;VALUE=DATE-TIME:20170111T163000Z
DTSTART;TZID=Europe/Berlin:20170111T173000
DTEND;TZID=Europe/Berlin:20170111T173000
X-MOZ-FAKED-MASTER:1
X-MOZ-GENERATION:1
END:VEVENT
BEGIN:VEVENT
CREATED:20170106T215137Z
LAST-MODIFIED:20170111T221145Z
DTSTAMP:20170111T221145Z
UID:882f4c15-03e9-451c-bf4f-b3422ed8ef54
SUMMARY:Obst
RECURRENCE-ID;TZID=Europe/Berlin:20170111T173000
DTSTART;TZID=Europe/Berlin:20170111T194500
DTEND;TZID=Europe/Berlin:20170111T201500
SEQUENCE:7
TRANSP:OPAQUE
X-MOZ-GENERATION:12
END:VEVENT
我注意到这个事件有几个特殊功能:
我尝试在Google日历和Outlook中导入它。在Google日历中,活动会显示在正确的日期和时间,并在事件发生前30分钟设置闹钟。使用Outlook(2013),我只能部分导入事件,并显示下面屏幕截图中显示的错误消息。我想只导入了第二个VEVENT,因为第一个是没有包含标题的那个。
我无法弄清楚这个事件是如何构建的。为此,我有几个问题:
答案 0 :(得分:1)
从标准的角度来看,通过仅使用RDATE(s)而不使用RRULE可以完美地表示重复发生的事件。 Lotus Notes等一些遗留客户端总是将重复规则转换为一系列RDATE。了解如何在https://tools.ietf.org/html/rfc5545#section-3.8.5.2进行计算 实际上,最近的客户端不能很好地处理包含RDATE的重复事件。他们可能会正确显示它们,但无法提供编辑它们的方法。
从你的截图中看来,这就是Outlook所抱怨的(不支持的重复发生模式)。
对于这个特殊的事件,它看起来确实非常时髦,因为这基本上只是一个实例的重复事件。使它更加时髦的是,该单个实例附加了一个例外,它覆盖了SUMMARY / DTSTART / DTEND。但这并不会使它无效。
(请注意,概述在VEVENT中不是强制性的。)
现在此事件无效,但出于其他原因: 1)RDATE应使用与DTSTART / DTEND相同的格式,即带有时区的本地时间 2)正如您所提到的,DTSTART和DTEND不能相等于https://tools.ietf.org/html/rfc5545#section-3.8.2.2