2

如果我使用谷歌图书馆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-07-17

2019-05-27

2021-05-24

2023-05-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-2445lib-recur以正确的方式指定或验证开始日期?

4

1 回答 1

1

RFC 5545状态

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

这就是为什么lib-recur总是添加开始实例。

但是,我们对此有一个未解决的问题(请参阅问题 22),我得出的结论是,仅迭代规则的实例并在稍后阶段(RecurrenceSet具体而言)添加开始实例是更好的设计。这也是 RFC 5545 所建议的。

我会解决这个问题,它将在 0.10 版中“修复”

于 2017-07-17T20:10:45.017 回答