【问题标题】:Calendar. Recurrent event occurrence. How to check if start date matched on pattern?日历。经常发生的事件。如何检查开始日期是否与模式匹配?
【发布时间】:2017-12-21 18:45:17
【问题描述】:

如果我使用谷歌库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以正确的方式指定或验证开始日期?

【问题讨论】:

    标签: java icalendar find-occurrences rfc5545 ical4j


    【解决方案1】:

    RFC 5545 状态

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

    这就是lib-recur 总是添加启动实例的原因。

    但是,我们对此有一个未解决的问题(请参阅 issue 22),我得出的结论是,最好只迭代规则的实例并在稍后阶段添加开始实例(在 @ 987654324@ 具体来说)。这也是 RFC 5545 的建议。

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

    【讨论】:

    • FTR:0.10 版刚刚发布,RecurrenceRuleIterator 不再返回与RRULE 不匹配的启动实例。
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多