I have to calculate event occurrences. Calculation should be based on recurrent event pattern. Recurrent event pattern is rfc5545 based.
I've found lib-recur library to calculate occurrences. Following description I see they provide calculation using the instances of a specific instance set (e.g. an rrule, an exrule, a list of rdates or exdates). I used calculation for RRULE, it seems works. I need in my logic find correctly all occurrences including into calculation EXDATE, EXRULE. But seems last exclusions does not support here. Small code example:
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);
}
}
result:
20170714T163325
20180523T163325
20190523T163325
Also I know that google based library can provide core handlers for RRULES, EXRULE... based on rfc5545 standard. But I've not found how to calculate occurrences here also(including RRULES, EXDATE, EXRULE).
More example but for google-rfc-2445
library:
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());
}
}
Result:
2017-07-14
2019-05-27
2021-05-24
2023-05-22
Please share link to open source library that already has the complex occurrence calculation functionality (calculation should include RRULE, EXDATEs at same time).