/// <summary> /// Gets a string summary of this rule. /// </summary> /// <returns></returns> public override string GetSummary() { if (FrequencyType == MonthlyFrequencyType.DayOfTheMonth) { //Occurs every {0} month(s) on day {1} return(string.Format("Occurs every {0} month(s) on day {1} of the month", RepeatInterval, DayOfTheMonth)); } else { return(string.Format("Occurs every {0} {1} of every {2} month(s)", CalculatedDayType.ToString().ToLower(), CalculcatedDayOption.ToString(), RepeatInterval)); } }
/// <summary> /// Calculates specific date rules for the given month. /// </summary> /// <param name="dt">The month and year to use.</param> /// <param name="dayOption">The option we are calculating.</param> /// <param name="instance">The instance of the option being calculated.</param> /// <returns>The date of the instance of this option.</returns> public static DateTime FindInstanceOfDay(this DateTime dt, CalculcatedDayOption dayOption, CalculatedDayType instance) { //The instance number corresponds to int instanceNumber = (int)instance; DateTime searchDay = new DateTime(dt.Year, dt.Month, 1); int daysInMonth = DateTime.DaysInMonth(dt.Year, dt.Month); if (dayOption == CalculcatedDayOption.Monday || dayOption == CalculcatedDayOption.Tuesday || dayOption == CalculcatedDayOption.Wednesday || dayOption == CalculcatedDayOption.Thursday || dayOption == CalculcatedDayOption.Friday || dayOption == CalculcatedDayOption.Saturday || dayOption == CalculcatedDayOption.Sunday) { //Converting to DayOfWeek used by DateTime. DayOfWeek dayOfWeek = DayOfWeek.Monday; switch (dayOption) { case CalculcatedDayOption.Monday: dayOfWeek = DayOfWeek.Monday; break; case CalculcatedDayOption.Tuesday: dayOfWeek = DayOfWeek.Tuesday; break; case CalculcatedDayOption.Wednesday: dayOfWeek = DayOfWeek.Wednesday; break; case CalculcatedDayOption.Thursday: dayOfWeek = DayOfWeek.Thursday; break; case CalculcatedDayOption.Friday: dayOfWeek = DayOfWeek.Friday; break; case CalculcatedDayOption.Saturday: dayOfWeek = DayOfWeek.Saturday; break; case CalculcatedDayOption.Sunday: dayOfWeek = DayOfWeek.Monday; break; } for (int i = 1; i <= 7; i++) { if (searchDay.DayOfWeek == dayOfWeek) { //Found the first instance. //If there are not at least 28 days after the first instance //then max instance is 4 otherwise it is 5. if (instanceNumber >= 5) { int instanceDay = searchDay.Day; if (daysInMonth - instanceDay < 28) { instanceNumber = 4; } else { instanceNumber = 5; } } return(searchDay.AddDays(7 * (instanceNumber - 1))); } //Move to the next day. searchDay = searchDay.AddDays(1); } } else if (dayOption == CalculcatedDayOption.Day) { if (instanceNumber < 5) { return(searchDay.AddDays(instanceNumber - 1)); } else { //last day of the month return(searchDay.AddMonths(1).AddDays(-1)); } } else if (dayOption == CalculcatedDayOption.Weekday) { if (instanceNumber < 5) { int instanceCount = 0; for (int i = 1; i <= daysInMonth; i++) { //Counting each instance of a weekday. if (searchDay.DayOfWeek == DayOfWeek.Monday || searchDay.DayOfWeek == DayOfWeek.Tuesday || searchDay.DayOfWeek == DayOfWeek.Wednesday || searchDay.DayOfWeek == DayOfWeek.Thursday || searchDay.DayOfWeek == DayOfWeek.Friday) { instanceCount++; } if (instanceCount == instanceNumber) { //we found the nth instance of this weekend day. return(searchDay); } searchDay = searchDay.AddDays(1); } } else { //last weekend day of the month DateTime lastInstance = new DateTime(); for (int i = 1; i <= daysInMonth; i++) { //Counting each instance of a weekeday. if (searchDay.DayOfWeek == DayOfWeek.Monday || searchDay.DayOfWeek == DayOfWeek.Tuesday || searchDay.DayOfWeek == DayOfWeek.Wednesday || searchDay.DayOfWeek == DayOfWeek.Thursday || searchDay.DayOfWeek == DayOfWeek.Friday) { lastInstance = searchDay; } searchDay = searchDay.AddDays(1); } return(lastInstance); } } else if (dayOption == CalculcatedDayOption.WeekendDay) { if (instanceNumber < 5) { int instanceCount = 0; for (int i = 1; i < daysInMonth; i++) { //Counting each instance of saturday or sunday. if (searchDay.DayOfWeek == DayOfWeek.Saturday || searchDay.DayOfWeek == DayOfWeek.Sunday) { instanceCount++; } if (instanceCount == instanceNumber) { //we found the nth instance of this weekend day. return(searchDay); } searchDay = searchDay.AddDays(1); } } else { //last weekend day of the month DateTime lastInstance = new DateTime(); for (int i = 1; i < daysInMonth; i++) { //Counting each instance of saturday or sunday. if (searchDay.DayOfWeek == DayOfWeek.Saturday || searchDay.DayOfWeek == DayOfWeek.Sunday) { lastInstance = searchDay; } searchDay = searchDay.AddDays(1); } return(lastInstance); } } return(new DateTime()); }