首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RFC5545。同时计算RRULE和EXDATE (EXRULE)的事件发生情况

RFC5545。同时计算RRULE和EXDATE (EXRULE)的事件发生情况
EN

Stack Overflow用户
提问于 2017-07-14 11:00:17
回答 1查看 2.2K关注 0票数 3

我必须计算事件的发生情况。计算应基于反复发生的事件模式。递归事件模式是基于rfc5545的。

我已经找到了利伯-罗瑟库来计算出现的情况。在下面的描述中,我看到它们使用特定实例集的实例(例如,rrule、exrule、rdate或exdate的列表)来提供计算。我为RRULE使用了计算,看起来很有效。我需要在我的逻辑找到正确的所有事件,包括在计算EXDATEEXRULE。但似乎最后的排除条款在这里并不支持。小代码示例:

代码语言:javascript
复制
import org.dmfs.rfc5545.DateTime;
import org.dmfs.rfc5545.recurrenceset.RecurrenceRuleAdapter;
import org.dmfs.rfc5545.recurrenceset.RecurrenceSet;
import org.dmfs.rfc5545.recurrenceset.RecurrenceSetIterator;
@Test
public void testSpecial() throws InvalidRecurrenceRuleException {
    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();
        // do something with nextInstance
        System.out.println(nextInstance);
    }
}

结果:

20170714T163325 20180523T163325 20190523T163325

我也知道基于google的图书馆可以为RRULES,EXRULE提供核心处理程序。基于rfc5545标准。但是我还没有找到如何在这里计算事件(包括RRULES,EXDATE,EXRULE)。

更多的例子是google-rfc-2445库:

代码语言:javascript
复制
import com.google.ical.compat.jodatime.LocalDateIterable;
import com.google.ical.compat.jodatime.LocalDateIterator;
import com.google.ical.compat.jodatime.LocalDateIteratorFactory;
import com.google.ical.values.RRule;
@Test
public void test() throws ParseException {
    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();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}

结果:

2017-07-14 2019-05-27 2021-05-24 2023-05-22

请共享到已经具有复杂发生计算功能的开源库的链接(计算应该同时包括RRULE、EXDATE)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 21:05:48

lib-recur确实支持计算递归集。不过,这个组件的接口还不完善(也不太方便)。

下面是一个简单的示例,说明如何使用一个RRULE和一个EXRULE:

代码语言:javascript
复制
// note: recurrence expansion takes place in a specific time zone
TimeZone tz = TimeZone.getDefault();
// the start of the recurring event
DateTime start = new DateTime(tz, 2017, 5 - 1 /* zero based */, 23, 12, 0, 0);

// parse the RRULE
RecurrenceRule recurrenceRule = new RecurrenceRule("FREQ=YEARLY;BYMONTHDAY=23;BYMONTH=5;COUNT=30");
// parse the EXRULE (in this case every 3rd instance of the RRULE)
RecurrenceRule exceptionRule = new RecurrenceRule("FREQ=YEARLY;INTERVAL=3;BYMONTHDAY=23;BYMONTH=5;COUNT=10");

// create an empty RecurrenceSet
// a recurrence set is the set of all actual instance of a recurring event and may consist of multiple instance and excludes sources 
RecurrenceSet recurrenceSet = new RecurrenceSet();
// add the instances of the RRULE
recurrenceSet.addInstances(new RecurrenceRuleAdapter(recurrenceRule));
// exclude the instances of the EXRULE
recurrenceSet.addExceptions(new RecurrenceRuleAdapter(exceptionRule));

RecurrenceSetIterator recurrenceSetIterator = recurrenceSet.iterator(start.getTimeZone(), start.getTimestamp());

int maxInstances = 10; // limit instances for rules that recur forever
// iterate as long as the recurrence set still has instances
while (recurrenceSetIterator.hasNext() && (!recurrenceRule.isInfinite() || maxInstances-- > 0))
{
    // get the next instance of the recurrence set
    DateTime nextInstance = new DateTime(start.getTimeZone(), recurrenceSetIterator.next());
    // do something with nextInstance
    System.out.println(nextInstance);
}

您可以看到,RecurrenceSetlong时间戳上运行,这是非常不理想的。

要支持RDATESEXDATES,可以使用RecurrenceList适配器。RecurrenceList要么接受一个时间戳数组,要么接受一个时区和一个逗号分隔的日期-时间或日期值字符串(就像为RDATES和EXDATES定义的那样):

代码语言:javascript
复制
// add more RDATES instances 
recurrenceSet.addInstances(new RecurrenceList("20171212T121212,20181212T121212", tz));

// add EXDATES
recurrenceSet.addExceptions(new RecurrenceList("20180523T120000,20190523T120000", tz));

注意,与RecurrenceRuleIterator不同的是,这个组件还没有任何测试覆盖率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45101330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档