假设我有一个带有单个事件的iCalendar。这有一个重复规则(RRULE)设置为COUNT
来限制它,但也有一些例外日期和一些例外规则。
我想计算最后出现的日期。
如果规则只设置了UNTIL
,这很容易,因为我知道这限制了可能的日期,所以我可以做以下事情。
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 Trigger,它使用iCalendar文件来确定何时触发。
答案 0 :(得分:1)
COUNT仅与RRULE相关联,而不与整个事件相关联。见rfc5545#section-3.8.5.3:
在 通过收集所有开始生成最终重现集 由任何指定的“RRULE”生成的DATE-TIME值 “RDATE”属性,然后排除任何启动DATE-TIME值 由“EXDATE”属性指定。
首先根据RRULE(包括其COUNT值)构建一个集合,然后删除EXDATE中提到的集合。
换句话说,如果你有一个COUNT为500和100 EXDATE实例的RRULE,你最终会有400个实例。
仅供参考,您提及例外规则,但在RFC5545中已弃用EXRULE。