C# 在DDay.iCal中查找事件的最后一次出现
假设我有一个带单个事件的iCalendar。这有一个定期规则(RRULE),设置了一个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
计数来限制它,但也有一些异常日期和一些异常规则
我想计算上次发生的日期
如果规则只有
直到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中遗漏了一个方法:)