From d86dec4818320440ec283aca67824c382f24b30f Mon Sep 17 00:00:00 2001 From: Markus Minichmayr Date: Sun, 20 Oct 2024 21:02:18 +0200 Subject: [PATCH 1/2] Doc Comment on RecurrencePatternEvaluator.Evaluate() --- Ical.Net/Evaluation/RecurrencePatternEvaluator.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs index 937c9455..d400668b 100644 --- a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs +++ b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs @@ -898,6 +898,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) From e59d522bf13fecbff14cc470647d4c35859a4717 Mon Sep 17 00:00:00 2001 From: Markus Minichmayr Date: Sun, 20 Oct 2024 21:03:12 +0200 Subject: [PATCH 2/2] RRule evalutation: Ignore BY[SECOND|MINUTE|HOUR] if DTSTART is date-only, as required by RFC 5545. --- .../Evaluation/RecurrencePatternEvaluator.cs | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs index d400668b..f97f0bd5 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 */) - { - r.ByHour.Add(referenceDate.Hour); + else + { + // 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