diff --git a/src/main/java/net/fortuna/ical4j/model/Component.java b/src/main/java/net/fortuna/ical4j/model/Component.java index 81d1ce629..88d8072df 100644 --- a/src/main/java/net/fortuna/ical4j/model/Component.java +++ b/src/main/java/net/fortuna/ical4j/model/Component.java @@ -339,24 +339,26 @@ public final Set> calculateRecurrenceSet(final Pe // but still intersect with it.. final T startMinusDuration = (T) period.getStart().minus(rDuration); + final T seed = start.get().getDate(); + // add recurrence rules.. List rRules = getProperties(Property.RRULE); if (!rRules.isEmpty()) { - recurrenceSet.addAll(rRules.stream().map(r -> ((RRule) r).getRecur().getDates(start.get().getDate(), + recurrenceSet.addAll(rRules.stream().map(r -> ((RRule) r).getRecur().getDates(seed, startMinusDuration, period.getEnd())).flatMap(List::stream) - .map(rruleDate -> new Period(rruleDate, rDuration)).collect(Collectors.toList())); + .map(rruleDate -> new Period<>(rruleDate, rDuration)).collect(Collectors.toList())); } else { // add initial instance if intersection with the specified period.. Period startPeriod; if (end.isPresent()) { - startPeriod = new Period<>(start.get().getDate(), end.get().getDate()); + startPeriod = new Period<>(seed, end.get().getDate()); } else { /* * PeS: Anniversary type has no DTEND nor DUR, define DUR * locally, otherwise we get NPE */ - startPeriod = duration.map(value -> new Period<>(start.get().getDate(), value.getDuration())).orElseGet( - () -> new Period<>(start.get().getDate(), new Duration(rDuration).getDuration())); + startPeriod = duration.map(value -> new Period<>(seed, value.getDuration())).orElseGet( + () -> new Period<>(seed, new Duration(rDuration).getDuration())); } if (period.intersects(startPeriod)) { recurrenceSet.add(startPeriod); @@ -372,7 +374,7 @@ public final Set> calculateRecurrenceSet(final Pe // subtract exception rules.. List exRules = getProperties(Property.EXRULE); - List exRuleDates = exRules.stream().map(e -> ((ExRule) e).getRecur().getDates(start.get().getDate(), + List exRuleDates = exRules.stream().map(e -> ((ExRule) e).getRecur().getDates(seed, period)).flatMap(List::stream).collect(Collectors.toList()); recurrenceSet.removeIf(recurrence -> exRuleDates.contains(recurrence.getStart()));