When you trying to schedule something on last day of month, and for example select 31 day (as last day) then ical4j doesn't return valid last day of month.
It is easily can be fixed with the following:
in Recur.java class
1) we need to calculate valid days for month
private DateList getMonthDayVariants(final DateList dates) {
if (getMonthDayList().isEmpty()) {
return dates;
}
DateList monthDayDates = new DateList(dates.getType(), dates.getTimeZone());
for (Iterator i = dates.iterator(); i.hasNext();) {
Date date = (Date) i.next();
Calendar cal = Dates.getCalendarInstance(date);
cal.setTime(date);
for (Iterator j = getMonthDayList().iterator(); j.hasNext();) {
Integer monthDay = (Integer) j.next();
// here we need to calculate valid last day
monthDay = getValidMonthDay((GregorianCalendar) cal, monthDay);
cal.set(Calendar.DAY_OF_MONTH, Dates.getAbsMonthDay(cal.getTime(), monthDay.intValue()));
monthDayDates.add(Dates.getInstance(cal.getTime(), monthDayDates.getType()));
}
}
return monthDayDates;
}
2) calculations for the last day might looks like this:
private Integer getValidMonthDay (GregorianCalendar c, Integer monthDay) {
if (monthDay < 29) {
return monthDay;
}
int month = c.get(Calendar.MONTH);
boolean leapYear = c.isLeapYear(c.get(Calendar.YEAR));
if (month == Calendar.FEBRUARY) {
return leapYear ? 29 : 28;
}
if (month == Calendar.APRIL || month == Calendar.JUNE || month == Calendar.SEPTEMBER || month == Calendar.NOVEMBER) {
return monthDay > 30 ? 30 : monthDay;
}
return monthDay;
}
Well, it mightbe not ideal solution - but it works correct.
Recur.java with correctly working fix