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

Java 日历。复发事件发生率。如何检查模式上的开始日期是否匹配?,java,icalendar,find-occurrences,rfc5545,ical4j,Java,Icalendar,Find Occurrences,Rfc5545,Ical4j,如果我使用谷歌库(计算发生次数) 我将得到以下结果: 2017-07-17 2019-05-27 2021-05-24 2023-05-22 考虑到模式,应该只有3个日期。考虑到每一个,我们可以发现第一个是多余的。我没有标记开始日期是否有效。正如你看到的,第一个不是。(如果我使用正确的开始日期创建iterable,结果将得到3个正确的日期。) 相似的实验(结果几乎相似,但差异很小) 结果计数正确,但第一次出现的结果不正确。第一次出现的正确性取决于(如果开始日期正确,第一次出现也将正确) 2017

如果我使用谷歌库(计算发生次数)

我将得到以下结果:

2017-07-17

2019-05-27

2021-05-24

2023-05-22

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

相似的实验(结果几乎相似,但差异很小)

结果计数正确,但第一次出现的结果不正确。第一次出现的正确性取决于(如果开始日期正确,第一次出现也将正确)

20170717T123104

20190527T123104

20210524T123104

如何使用或以正确的方式指定或验证开始日期?

状态

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

这就是为什么
lib recur
总是添加start实例的原因

然而,关于这一点,我们有一个公开的问题(请参阅),我得出的结论是,更好的设计是只迭代规则的实例,并在稍后阶段添加开始实例(具体来说,在
RecurrenceSet
中)。这也是RFC5545的建议


我会处理这个问题,它将在版本0.10中“修复”:版本0.10刚刚发布,并且
RecurrenceRuleIterator
不再返回与
RRULE
不匹配的开始实例。
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);
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);
}