Example #1
0
        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;
                }
            }
        }