java - 日历。反复发生的事件。如何检查开始日期是否与模式匹配?

标签 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-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 总是添加起始实例。

但是,我们对此有一个 Unresolved 问题(请参阅 issue 22 ),我得出的结论是,最好的设计是仅迭代规则的实例并在稍后阶段添加起始实例(在 具体来说,是 RecurrenceSet)。 RFC 5545 似乎也是这么建议的。

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

关于java - 日历。反复发生的事件。如何检查开始日期是否与模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140688/

相关文章:

java - 执行 Neo4j Cypher 查询(通过 Java)嵌入式模式时出错

Python icalender 在 ORGANIZER 中因变音符号而窒息

regex - Ansible:如何查找变量中出现的单词?

javascript - 如何按日期计算对象数组中的出现次数

java - 任务 ':app:mergeDebugResources'的执行失败。 > java.util.concurrent.ExecutionException:com.android.builder.internal.aapt.v2.Aapt2Exception:

java - 由于 ProgressDialog,尝试规避 AsyncTask 上的 NetworkOnMainThreadException

java - Java实现文件上传类型

php - 通过 PHP 访问 JSON 数据

ruby-on-rails - Ical 更改了我在制作 .ics 文件时输入的时间