iCal - Thunderbird 生成的奇怪事件

iCal - Strange events generated by Thunderbird

我正在研究用 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 是导入的,因为第一个是没有包含标题的。

我不知道这个事件是如何构建的。为此,我有几个问题:

从标准的角度来看,可以通过仅使用 RDATE(s) 而不使用 RRULE 来完美地表示重复发生的事件。 Lotus Notes 等一些遗留客户端总是将重复规则转换为一系列 RDATE。在 https://www.rfc-editor.org/rfc/rfc5545#section-3.8.5.2 查看您应该如何进行计算 实际上,大多数最近的客户端并不能很好地处理包含 RDATE(s) 的重复事件。他们可能会正确显示它们,但无法提供编辑它们的方法。

从您的屏幕截图来看,这似乎是 Outlook 所抱怨的(不支持的重复模式)。

至于这个特定的事件,它看起来确实很时髦,因为这基本上是一个只有一个实例的重复事件。更奇怪的是,这个单个实例附加了一个异常,它覆盖了 SUMMARY/DTSTART/DTEND。但这并不会使它无效。

(请注意,摘要在 VEVENT 中不是强制性的)。

现在这个活动是无效的,但是有其他原因:

  1. RDATE 应使用与 DTSTART/DTEND 相同的格式,即带有时区的本地时间
  2. 如您所述,根据 https://www.rfc-editor.org/rfc/rfc5545#section-3.8.2.2
  3. ,DTSTART 和 DTEND 不能相等