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
我注意到这次活动有几个特点:
- 主要事件不包含摘要,只有链接异常包含摘要。
- 开始日期和结束日期相同。
- 主事件不包含任何重复规则 (RRULE),但包含重复日期 (RDATE)。
- 主要事件中的重复日期位于事件开始日期和时间之前 30 分钟。
我尝试将其导入 Google 日历和 Outlook。在 Google 日历中,事件显示在正确的日期和时间,闹钟设置为事件发生前 30 分钟。在 Outlook (2013) 中,我只能部分导入事件,并出现下面屏幕截图中显示的错误消息。我想只有第二个 VEVENT 是导入的,因为第一个是没有包含标题的。
我不知道这个事件是如何构建的。为此,我有几个问题:
- 这个事件是否正确生成,或者它可能是 Thunderbird 日历中的错误?
- 可能存在没有 RRULE 的 RDATE 模式?这有意义吗?
- RDATE 模式中的日期是否应该被视为警报而不是最终复发的发生?
- 在这种情况下,主事件和他的例外是什么关系,因为主事件不包含任何超出RDATE模式的递归规则,这似乎不是真正的递归规则?
- 未记录的 X-MOZ-FAKED-MASTER 属性可能意味着什么?跟这个奇怪事件的构建方式有关?
从标准的角度来看,可以通过仅使用 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 中不是强制性的)。
现在这个活动是无效的,但是有其他原因:
- RDATE 应使用与 DTSTART/DTEND 相同的格式,即带有时区的本地时间
- 如您所述,根据 https://www.rfc-editor.org/rfc/rfc5545#section-3.8.2.2
,DTSTART 和 DTEND 不能相等
我正在研究用 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 是导入的,因为第一个是没有包含标题的。
我不知道这个事件是如何构建的。为此,我有几个问题:
- 这个事件是否正确生成,或者它可能是 Thunderbird 日历中的错误?
- 可能存在没有 RRULE 的 RDATE 模式?这有意义吗?
- RDATE 模式中的日期是否应该被视为警报而不是最终复发的发生?
- 在这种情况下,主事件和他的例外是什么关系,因为主事件不包含任何超出RDATE模式的递归规则,这似乎不是真正的递归规则?
- 未记录的 X-MOZ-FAKED-MASTER 属性可能意味着什么?跟这个奇怪事件的构建方式有关?
从标准的角度来看,可以通过仅使用 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 中不是强制性的)。
现在这个活动是无效的,但是有其他原因:
- RDATE 应使用与 DTSTART/DTEND 相同的格式,即带有时区的本地时间
- 如您所述,根据 https://www.rfc-editor.org/rfc/rfc5545#section-3.8.2.2 ,DTSTART 和 DTEND 不能相等