0

假设我有一个带有单个事件的 iCalendar。这有一个重复规则 (RRULE) 设置COUNT为限制它,但也有一些例外日期和一些例外规则。

我想计算最后一次发生的日期。

如果规则只UNTIL设置了 s,这将很容易,因为我知道这限制了可能的日期,所以我可以执行以下操作。

IICalendar calendar = LoadCalendar();
Event evt = calendar.Events.Single();
DateTime start = evt.Start;
DateTime end = evt.RecurrenceRules.Select(r => r.Until).Max();
var lastOccurrence = evt.GetOccurrences(start, end).Last();

但是,这种方法不适用于 COUNT,因为异常可以将最后一次发生无限期地推到未来(例如,假设每周发生的前 500 个日期已被排除 - 这会将结束日期推到未来大约 10 年)。

有没有一种直接的方法来确定这种情况下的最后一次出现?(最终,我可以编写自己的规则解析器,或者反思 DDay 中内置的规则解析器,但我希望有一种更简单的方法!)。

背景

作为参考,我的目标是构建一个 Quartz.NET触发器,它使用 iCalendar 文件来确定何时触发。

4

1 回答 1

1

COUNT 仅与 RRULE 相关联,而不与整个事件相关联。见rfc5545#section-3.8.5.3

通过收集由任何指定的“RRULE”和“RDATE”属性生成的所有起始 DATE-TIME 值,然后排除由“EXDATE”属性指定的任何起始 DATE-TIME 值,生成最终的重复集。

您首先根据 RRULE(包括其 COUNT 值)构建一个集合,然后删除 EXDATE 中提到的那些。

换句话说,如果您有一个 COUNT 为 500 和 100 个 EXDATE 实例的 RRULE,那么您最终会得到 400 个实例。

仅供参考,您提到异常规则,但 EXRULE 在 RFC5545 中已被弃用。

于 2013-08-14T10:09:09.133 回答