日历。重复发生的事件。如何检查模式上的开始日期是否匹配?

时间:2017-07-17 09:36:59

标签: java icalendar find-occurrences rfc5545 ical4j

如果我使用谷歌库google-rfc-2445(计算事件)

String sRule = "RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=2;BYMONTH=5;BYMONTHDAY=22,23,24,25,26,27,28;BYDAY=MO";
LocalDateIterable localDateIterable = LocalDateIteratorFactory
            .createLocalDateIterable(sRule, org.joda.time.LocalDate.now(), true);
LocalDateIterator iterator = localDateIterable.iterator();
iterator.forEachRemaining(System.out::println);

我会得到结果:

  

2017年7月17日

     

2019年5月27日

     

2021年5月24日

     

2023年5月22日

考虑到模式,应该只有3个日期。考虑到每一个,我们可以发现第一个是多余的。如果开始日期有效,我没有标记。正如你所看到的那样,第一个不是。 (如果我使用正确的开始日期创建可迭代的结果,我会得到3个正确的日期。)

使用 lib-recur 进行类似的实验(结果几乎与小差异相似)

RecurrenceRule recurrenceRule = new RecurrenceRule("FREQ=YEARLY;BYMONTHDAY=23;BYMONTH=5;COUNT=3");
RecurrenceRuleIterator it = recurrenceRule.iterator(DateTime.nowAndHere());
int maxInstances = 10; // limit instances for rules that recur forever
while (it.hasNext() && (!recurrenceRule.isInfinite() || maxInstances-- > 0)) {
    DateTime nextInstance = it.nextDateTime();
    System.out.println(nextInstance);
}

结果计数是正确的,但第一次出现不正确。首次出现的正确程度取决于(如果开始日期是正确的,首次出现也是正确的)......

  

20170717T123104

     

20190527T123104

     

20210524T123104

如何使用google-rfc-2445 lib-recur 以正确的方式指定或验证开始日期?

1 个答案:

答案 0 :(得分:1)

RFC 5545

  

“VEVENT”的“DTSTART”属性指定包含性    事件的开始。对于重复发生的事件,它还指定了    重复集中的第一个实例。

这就是lib-recur总是添加开始实例的原因。

但是,我们有一个公开的问题(参见issue 22),我得出的结论是,更好的设计是仅迭代规则的实例并在稍后阶段添加启动实例(在RecurrenceSet中具体而言)。这也是RFC 5545似乎提出的建议。

我会处理这个,它将在0.10版本中“修复”