日历。重复事件发生。如何检查开始日期是否与模式匹配?
Calendar. Recurrent event occurrence. How to check if start date matched on pattern?
如果我使用 google 库 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-2445 或 lib-recur 以正确的方式指定或验证开始日期?
RFC 5545 状态
The "DTSTART" property for a "VEVENT" specifies the inclusive
start of the event. For recurring events, it also specifies the
very first instance in the recurrence set.
这就是为什么 lib-recur
总是添加开始实例。
但是,我们有一个未解决的问题(请参阅 issue 22),我得出的结论是,最好设计为仅迭代规则的实例并在以后添加开始实例阶段(在 RecurrenceSet
中具体)。这也是 RFC 5545 似乎建议的内容。
我会解决这个问题,它会在 0.10 版本中“修复”
如果我使用 google 库 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-2445 或 lib-recur 以正确的方式指定或验证开始日期?
RFC 5545 状态
The "DTSTART" property for a "VEVENT" specifies the inclusive start of the event. For recurring events, it also specifies the very first instance in the recurrence set.
这就是为什么 lib-recur
总是添加开始实例。
但是,我们有一个未解决的问题(请参阅 issue 22),我得出的结论是,最好设计为仅迭代规则的实例并在以后添加开始实例阶段(在 RecurrenceSet
中具体)。这也是 RFC 5545 似乎建议的内容。
我会解决这个问题,它会在 0.10 版本中“修复”