diff --git a/lib/ical/recur_expansion.js b/lib/ical/recur_expansion.js index f5017f30..98b420b5 100644 --- a/lib/ical/recur_expansion.js +++ b/lib/ical/recur_expansion.js @@ -198,6 +198,21 @@ class RecurExpansion { } } + /** + * Compare two ICAL.Time objects. When the second parameter is a timeless date + * and the first parameter is date-with-time, strip the time and compare only + * the days. + * + * @private + * @param {ICAL.Time} a The one object to compare + * @param {ICAL.Time} b The other object to compare + */ + _compare_special(a, b) { + if (!a.isDate && b.isDate) + return new Time({ year: a.year, month: a.month, day: a.day }).compare(b); + else return a.compare(b); + } + /** * Retrieve the next occurrence in the series. * @return {ICAL.Time} @@ -248,9 +263,10 @@ class RecurExpansion { // check the negative rules if (this.exDate) { - compare = this.exDate.compare(this.last); + //EXDATE can be in DATE format, but DTSTART is in DATE-TIME format + compare = this._compare_special(this.last, this.exDate); - if (compare < 0) { + if (compare > 0) { this._nextExDay(); } @@ -397,10 +413,12 @@ class RecurExpansion { if (component.hasProperty('exdate')) { this.exDates = this._extractDates(component, 'exdate'); // if we have a .last day we increment the index to beyond it. + // When DTSTART is in DATE-TIME format, EXDATE is in DATE format and EXDATE is + // the date of DTSTART, _compare_special finds this out and compareTime fails. this.exDateInc = binsearchInsert( this.exDates, this.last, - (a, b) => a.compare(b) + this._compare_special ); this.exDate = this.exDates[this.exDateInc];