public IEnumerable <Occurrence> GetOccurrences(int maxPostNowOccurrences = 100) { Requires.Valid(this, this.GetType().Name); uint occNum = 0; var now = DateTime.UtcNow; int postNowOccurrences = 0; var dt = AllDay ? new DateTime(StartDate.Year, StartDate.Month, StartDate.Day, 0, 0, 0, 0, DateTimeKind.Utc) : new DateTime(StartDate.Year, StartDate.Month, StartDate.Day, StartTimeUtc.Hour, StartTimeUtc.Minute, StartTimeUtc.Second, StartTimeUtc.Millisecond, DateTimeKind.Utc); while ( IsPerpetual || (EndAfterNOccurrences > 0 && occNum < EndAfterNOccurrences) || (EndBeforeDate.HasValue && dt < EndBeforeDate)) { if (dt > now && ++postNowOccurrences > maxPostNowOccurrences) { break; } yield return(new Occurrence(dt, Duration, occNum++)); switch (PatternType) { case PatternTypes.Daily: if (DailyPattern.EveryNDays > 0) { dt = dt.AddDays(DailyPattern.EveryNDays); } else if (DailyPattern.EveryWeekday) { do { dt = dt.AddDays(1); } while (!dt.IsWeekday()); } else { throw new NotImplementedException(); } break; case PatternTypes.Weekly: for (;;) { dt = dt.AddDays(1); if (dt.DayOfWeek == DayOfWeek.Sunday) { dt = dt.AddDays((WeeklyPattern.RecurEveryNWeeksOn - 1) * 7); } if (WeeklyPattern.OccursOn(dt.DayOfWeek)) { break; } } break; } } }