【问题标题】:Find last occurrence of an event in DDay.iCal在 DDay.iCal 中查找最后一次发生的事件
【发布时间】:2013-08-13 12:57:31
【问题描述】:

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

我想计算上次发生的日期。

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

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 文件来确定何时触发。

【问题讨论】:

    标签: c# icalendar dday


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您指出 EXRULE 的弃用 - 我们自己不使用它们,但很高兴知道我可以忽略它们。根据您的回答,看来我必须自己编写一段不错的代码,这很好 - 我只是希望发现我错过了 DDay API 中的一个方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多