1

我正在使用 google-rfc2445 库 (com.google.ical) 来解析 RRULE。

在下面的测试中,规则 UNTIL 设置为过去(1999 年),dtStart 设置为现在。我期待 0 结果,但不知何故得到 1 结果,这看起来像 dtStart。我傻眼了,为什么它包含了 UNTIL 绑定之外的项目。这是预期的行为吗?

@Test
    public void testRruleExpiryInPast1() {
        String rruleString = "RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=19990103T000000Z";
        DateTime startDate = DateTime.now(DateTimeZone.UTC);
        System.out.println("startDate timeZone =" + startDate.getZone());
        try {
            DateTimeIterable localDateIterable = DateTimeIteratorFactory.createDateTimeIterable(rruleString, startDate, startDate.getZone(), false);
            DateTimeIterator iterator = localDateIterable.iterator();
            while (iterator.hasNext()) {
                DateTime next = iterator.next();
                System.out.println(next);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }


上述测试输出

startDate timeZone =UTC
2022-02-06T18:52:31.000Z

更新1:根据这个答案,谷歌日历中的 ICAL 有额外的事件,无论 UNTIL 是否在过去,似乎 DTSTART 总是第一次出现。我觉得这很奇怪。现在我求助于正则表达式解析 rrule 字符串来确定是否存在 UNTIL 以及是否存在过去。:(

4

1 回答 1

0

您的用例是一个合乎逻辑的极端案例。

从技术上讲,第 4.3.10 节中的 RFC2245说:

“DTSTART”属性值(如果指定)计为第一次出现。

基本逻辑是第一个实例由 指定DTSTART,后续实例应从RRULE.

在您的情况下,因为您在我们UNTIL之前指定DTSTART,据我所知,在灰色区域中,RFC 没有指定如何生成 RRULE 实例。

我怀疑谷歌库坚持 RFC 的字母并预先挂DTSART在实例列表中,而不检查它是否在指定的日期之前,UNTIL因为 RFC 没有提到这一点。

于 2022-02-10T18:52:00.713 回答