0

単一のイベントを持つ iCalendar があるとします。これには、それを制限するための繰り返しルール (RRULE) が設定されてCOUNTいますが、いくつかの例外日といくつかの例外ルールもあります。

最後に発生した日付を計算したい。

ルールが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 に組み込まれているパーサーを検討することができますが、もっと簡単な方法を望んでいます!)。

バックグラウンド

参考までに、iCalendar ファイルを使用して起動するタイミングを決定するQuartz.NETトリガーを構築することを目指しています。

4

1 に答える 1

1

COUNT は、イベント全体ではなく、RRULE にのみ関連付けられます。rfc5545#section-3.8.5.3を参照してください:

最終的な繰り返しセットは、指定された「RRULE」および「RDATE」プロパティのいずれかによって生成されたすべての開始 DATE-TIME 値を収集し、「EXDATE」プロパティによって指定された開始 DATE-TIME 値を除外することによって生成されます。

最初に RRULE (その COUNT 値を含む) に基づいてセットを構築し、次に EXDATE に記載されているものを削除します。

つまり、COUNT が 500 で EXDATE インスタンスが 100 の RRULE がある場合、400 インスタンスになります。

参考までに、例外ルールについて言及しましたが、EXRULE は RFC5545 で廃止されました。

于 2013-08-14T10:09:09.133 に答える