static public IList <Occurrence> GetOccurrences(IRecurrable recurrable, IDateTime periodStart, IDateTime periodEnd, bool includeReferenceDateInResults) { List <Occurrence> occurrences = new List <Occurrence>(); IEvaluator evaluator = recurrable.GetService(typeof(IEvaluator)) as IEvaluator; if (evaluator != null) { // Change the time zone of periodStart/periodEnd as needed // so they can be used during the evaluation process. periodStart = DateUtil.MatchTimeZone(recurrable.Start, periodStart); periodEnd = DateUtil.MatchTimeZone(recurrable.Start, periodEnd); IList <IPeriod> periods = evaluator.Evaluate( recurrable.Start, DateUtil.GetSimpleDateTimeData(periodStart), DateUtil.GetSimpleDateTimeData(periodEnd), includeReferenceDateInResults); foreach (IPeriod p in periods) { // Filter the resulting periods to only contain those between // startTime and endTime. if (p.StartTime.GreaterThanOrEqual(periodStart) && p.StartTime.LessThanOrEqual(periodEnd)) { occurrences.Add(new Occurrence(recurrable, p)); } } occurrences.Sort(); } return(occurrences); }
static public IList <Occurrence> GetOccurrences(IRecurrable recurrable, IDateTime periodStart, IDateTime periodEnd, bool includeReferenceDateInResults) { List <Occurrence> occurrences = new List <Occurrence>(); IEvaluator evaluator = recurrable.GetService(typeof(IEvaluator)) as IEvaluator; if (evaluator != null) { // Ensure the start time is associated with the object being queried IDateTime start = recurrable.Start.Copy <IDateTime>(); start.AssociatedObject = recurrable as ICalendarObject; // Change the time zone of periodStart/periodEnd as needed // so they can be used during the evaluation process. periodStart = DateUtil.MatchTimeZone(start, periodStart); periodEnd = DateUtil.MatchTimeZone(start, periodEnd); IList <IPeriod> periods = evaluator.Evaluate( start, DateUtil.GetSimpleDateTimeData(periodStart), DateUtil.GetSimpleDateTimeData(periodEnd), includeReferenceDateInResults); foreach (IPeriod p in periods) { // Filter the resulting periods to only contain those // that occur sometime between startTime and endTime. // NOTE: fixes bug #3007244 - GetOccurences not returning long spanning all-day events IDateTime endTime = p.EndTime ?? p.StartTime; if (endTime.GreaterThan(periodStart) && p.StartTime.LessThanOrEqual(periodEnd)) { occurrences.Add(new Occurrence(recurrable, p)); } } occurrences.Sort(); } return(occurrences); }
private IRecurrencePattern ProcessRecurrencePattern(IDateTime referenceDate) { var r = new RecurrencePattern(); r.CopyFrom(Pattern); // Convert the UNTIL value to one that matches the same time information as the reference date if (r.Until != DateTime.MinValue) { r.Until = DateUtil.MatchTimeZone(referenceDate, new iCalDateTime(r.Until)).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 */) { 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 BYDAY, BYYEARDAY, or BYWEEKNO is specified, then // we don't default BYDAY, BYMONTH or BYMONTHDAY if (r.ByDay.Count == 0) { // If the frequency is weekly, use the original date's day of week. // NOTE: fixes WeeklyCount1() and WeeklyUntil1() handling // If BYWEEKNO is specified and BYMONTHDAY/BYYEARDAY is not specified, // then let's add BYDAY to BYWEEKNO. // NOTE: fixes YearlyByWeekNoX() handling if (r.Frequency == FrequencyType.Weekly || ( r.ByWeekNo.Count > 0 && r.ByMonthDay.Count == 0 && r.ByYearDay.Count == 0 )) { r.ByDay.Add(new WeekDay(referenceDate.DayOfWeek)); } // If BYMONTHDAY is not specified, // default to the current day of month. // NOTE: fixes YearlyByMonth1() handling, added BYYEARDAY exclusion // to fix YearlyCountByYearDay1() handling if (r.Frequency > FrequencyType.Weekly && r.ByWeekNo.Count == 0 && r.ByYearDay.Count == 0 && r.ByMonthDay.Count == 0) { r.ByMonthDay.Add(referenceDate.Day); } // If BYMONTH is not specified, default to // the current month. // NOTE: fixes YearlyCountByYearDay1() handling if (r.Frequency > FrequencyType.Monthly && r.ByWeekNo.Count == 0 && r.ByYearDay.Count == 0 && r.ByMonth.Count == 0) { r.ByMonth.Add(referenceDate.Month); } } return(r); }