1

RRULE 基于开始时间的不同行为:

嗨,我目前正在尝试编写一个 cron 到 rrule 转换器,但遇到了一些特定规则的问题。对于以下规则:“FREQ=YEARLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11,12;BYMONTHDAY=1,2,3,4,5,6, 7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31; BYDAY=SU,MO,TU,WE,TH,FR,SA;BYHOUR=0,10,20;BYMINUTE=0"

日期迭代器的行为根据指定的开始时间而有所不同:

        final String rule2 = "FREQ=YEARLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11,12;BYMONTHDAY=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYHOUR=0,10,20;BYMINUTE=0";
        final Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-10-01");
        final Date startDate2 = new SimpleDateFormat("yyyy-MM-dd").parse("2019-12-01");

        System.out.println("Biweekly Rule Date 1");
        final List<Date> biweeklyStartDate1 = biweeklyDates(rule2, startDate, 100);
        System.out.println("Biweekly Rule Date 1 Result Count " + biweeklyStartDate1.size());

        System.out.println("Biweekly Rule Date 2");
        final List<Date> biweeklyStartDate2 = biweeklyDates(rule2, startDate2, 100);
        System.out.println("Biweekly Rule Date 2 Result Count " + biweeklyStartDate2.size());

   private static List<Date> biweeklyDates(final String rule, final Date date, final int limit) {
        final RecurrenceRuleScribe scribe = new RecurrenceRuleScribe();
        final ParseContext context = new ParseContext();
        context.setVersion(ICalVersion.V2_0);
        final RecurrenceRule recurrenceRule = scribe.parseText("RRULE:" + rule,null, new ICalParameters(), context);
        final DateIterator iterator = recurrenceRule.getDateIterator(date, TimeZone.getTimeZone("GMT"));

        final List<Date> values  = new ArrayList<>();
        while (iterator.hasNext()) {
            final Date next = iterator.next();
            values.add(next);
            System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(next));
            if (values.size() >= limit) {
                break;
            }
        }
        return values;
    }

在此示例中,我尝试使用相同的规则检索 100 次出现。返回的出现次数因指定的开始时间而异。第一个日期将返回预期的 100 个结果,第二个日期将返回一个无效的事件,这似乎是开始日期。这似乎是由一年中的最后一个月引起的,当指定另一个日期为 12 月时,似乎返回了相同的返回值。Google-rfc-2445 具有相同的行为,但 ical4j 和其他一些来自其他语言的 rrule 评估器能够产生预期的结果。

4

0 回答 0