2017-10-11 136 views
0

我正在研究用C++编写的iCal解析器。在这种情况下,我注意到几个事件,都是由Thunderbird生成的,我的解析器无法正确解析。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属性?这与这个奇怪事件的建立方式有关吗?
+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

+0

Thx为这个答案,允许我决定一个好的策略来正确地管理这类事件。 –