C# 在DDay.iCal中查找事件的最后一次出现

C# 在DDay.iCal中查找事件的最后一次出现,c#,icalendar,dday,C#,Icalendar,Dday,假设我有一个带单个事件的iCalendar。这有一个定期规则(RRULE),设置了一个计数来限制它,但也有一些异常日期和一些异常规则 我想计算上次发生的日期 如果规则只有直到s设置,这将很容易,因为我知道这限制了可能的日期,因此我可以执行以下操作 IICalendar calendar = LoadCalendar(); Event evt = calendar.Events.Single(); DateTime start = evt.Start; DateTime end = evt.Rec

假设我有一个带单个事件的iCalendar。这有一个定期规则(RRULE),设置了一个
计数来限制它,但也有一些异常日期和一些异常规则

我想计算上次发生的日期

如果规则只有
直到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();
但是,这种方法不适用于计数,因为例外情况可能会将最后一次事件无限期地推到未来(例如,假设每周事件的前500个日期已被排除在外-这将把结束日期推到未来10年左右)

是否有一种简单的方法来确定此场景中的最后一次事件?(最终,我可以编写自己的规则解析器,或者反思DDay中内置的规则解析器,但我希望有一种更简单的方法!)

背景


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

计数仅与RRULE相关,而不是与整个事件相关。见:

最终的重复集是通过收集所有开始项生成的 由任何指定的“RRULE”生成的日期时间值,以及 “RDATE”属性,然后排除任何开始日期时间值 由“EXDATE”属性指定

首先基于RRULE(包括其计数值)构建一个集合,然后删除EXDATE中提到的集合

换句话说,如果一个RRULE的计数分别为500和100个EXDATE实例,那么最终将得到400个实例


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

感谢您指出EXRULE的弃用-我们自己不使用它们,但很高兴知道我可以忽略它们。从您的回答来看,看起来我必须自己编写一段相当好的代码,这很好——我只是希望发现我在DDay API中遗漏了一个方法:)