我必须计算事件的发生。计算应基于经常发生的事件模式。重复事件模式基于rfc5545。
我找到了lib-recur库来计算出现次数。以下描述我看到他们使用特定实例集的实例(例如 rrule、exrule、rdates 或 exdates 列表)提供计算。我对 RRULE 使用了计算,它似乎有效。我需要在我的逻辑中正确找到所有出现的事件,包括计算EXDATE、EXRULE。但似乎最后的排除不支持这里。小代码示例:
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
库:
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)。