iCal - Thunderbird生成的奇怪事件

时间:2017-10-11 16:24:41

标签: parsing events outlook icalendar 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

我注意到这个事件有几个特殊功能:

  • 主要事件不包含摘要,只有链接的例外包含一个。
  • 开始日期和结束日期相等。
  • 主要事件不包含任何重复规则(RRULE),但它包含重复日期(RDATE)。
  • 主赛事的重现日期位于赛事开始日期和时间前30分钟。

我尝试在Google日历和Outlook中导入它。在Google日历中,活动会显示在正确的日期和时间,并在事件发生前30分钟设置闹钟。使用Outlook(2013),我只能部分导入事件,并显示下面屏幕截图中显示的错误消息。我想只导入了第二个VEVENT,因为第一个是没有包含标题的那个。

The event imported in Outlook

我无法弄清楚这个事件是如何构建的。为此,我有几个问题:

  • 此事件是否正确生成,或者它可能是Thunderbird日历中的错误?
  • RDATE模式可能没有RRULE吗?这有道理吗?
  • RDATE模式中的日期应该被视为警报而不是最终重复发生吗?
  • 在这种情况下,主事件与其异常之间的关系是什么,因为主事件不包含RDATE模式之外的任何重复规则,这似乎不是真正的重复规则?
  • 什么可能意味着未记录的X-MOZ-FAKED-MASTER属性?这与这个奇怪事件的构建方式有关吗?

1 个答案:

答案 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