日历。经常性事件发生。如何检查模式上匹配的开始日期?

问题描述:

如果我使用谷歌图书馆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-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以正确方式验证开始日期?

RFC 5545状态

的 “DTSTART” 属性的 “VEVENT” 指定的包容性 启动事件。对于重复性事件,它还指定了重复集中的第一个实例 。

这就是为什么lib-recur总是添加启动实例。

但是,我们对此有一个公开的问题(请参阅issue 22),我得出结论:更好的设计是只迭代规则的实例并在稍后阶段添加启动实例(在RecurrenceSet到请明确点)。这也是RFC 5545似乎表明的。

我会照顾这和版本0.10

+0

将“固定” FTR:0.10版本刚刚发布,并'RecurrenceRuleIterator'不再返回开始不匹配'RRULE'实例。 – Marten