diff --git a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs index 937c9455a..f97f0bd50 100644 --- a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs +++ b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs @@ -69,20 +69,37 @@ private RecurrencePattern ProcessRecurrencePattern(IDateTime referenceDate) r.Until = DateUtil.MatchTimeZone(referenceDate, new CalDateTime(r.Until, referenceDate.TzId)).Value; } - if (r.Frequency > FrequencyType.Secondly && r.BySecond.Count == 0 && referenceDate.HasTime - /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) + if (referenceDate.HasTime) { - r.BySecond.Add(referenceDate.Second); - } - if (r.Frequency > FrequencyType.Minutely && r.ByMinute.Count == 0 && referenceDate.HasTime - /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) - { - r.ByMinute.Add(referenceDate.Minute); + if (r.Frequency > FrequencyType.Secondly && r.BySecond.Count == 0 && referenceDate.HasTime + /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) + { + r.BySecond.Add(referenceDate.Second); + } + if (r.Frequency > FrequencyType.Minutely && r.ByMinute.Count == 0 && referenceDate.HasTime + /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) + { + r.ByMinute.Add(referenceDate.Minute); + } + if (r.Frequency > FrequencyType.Hourly && r.ByHour.Count == 0 && referenceDate.HasTime + /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) + { + r.ByHour.Add(referenceDate.Hour); + } } - if (r.Frequency > FrequencyType.Hourly && r.ByHour.Count == 0 && referenceDate.HasTime - /* NOTE: Fixes a bug where all-day events have BySecond/ByMinute/ByHour added incorrectly */) + else { - r.ByHour.Add(referenceDate.Hour); + // The BYSECOND, BYMINUTE and BYHOUR rule parts MUST NOT be specified + // when the associated "DTSTART" property has a DATE value type. + // These rule parts MUST be ignored in RECUR value that violate the + // above requirement(e.g., generated by applications that pre - date + // this revision of iCalendar). + r.BySecond.Clear(); + r.BySecond.Add(0); + r.ByMinute.Clear(); + r.ByMinute.Add(0); + r.ByHour.Clear(); + r.ByHour.Add(0); } // If BYDAY, BYYEARDAY, or BYWEEKNO is specified, then @@ -898,6 +915,14 @@ private Period CreatePeriod(DateTime dt, IDateTime referenceDate) return new Period(newDt); } + /// + /// Evaluate the occurrences of this recurrence pattern. + /// + /// The reference date, i.e. DTSTART. + /// Start (incl.) of the period occurrences are generated for. + /// End (excl.) of the period occurrences are generated for. + /// Whether the referenceDate itself should be returned. Ignored as the reference data MUST equal the first occurrence of an RRULE. + /// public override HashSet Evaluate(IDateTime referenceDate, DateTime periodStart, DateTime periodEnd, bool includeReferenceDateInResults) { if ((this.Pattern.Frequency != FrequencyType.None) && (this.Pattern.Frequency < FrequencyType.Daily) && !referenceDate.HasTime)