private static void AdjustForRepeatOnMonths(ref DateTime dt, eMonthRecurrence repeatOnMonths) { while (((int)Math.Pow(2, (dt.Month - 1)) & (int)repeatOnMonths) == 0) dt = dt.AddMonths(1); }
private static DateTime GetNextMonthlyRecurrence(DateTime startDate, eRelativeDayInMonth repeatOnRelativeDayInMonth, DayOfWeek relativeDayOfWeek, int repeatOnDayOfMonth, eMonthRecurrence repeatOnMonths) { Calendar cal = GetCalendar(); if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.None) { DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1); if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months return dt.AddDays(Math.Min(cal.GetDaysInMonth(dt.Year, dt.Month), repeatOnDayOfMonth) - 1); } else { if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.First) { DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1); if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months while (dt.DayOfWeek != relativeDayOfWeek) dt = dt.AddDays(1); return dt; } else if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Last) { DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day + 1); if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months dt = dt.AddDays(cal.GetDaysInMonth(dt.Year, dt.Month) - 1); while (dt.DayOfWeek != relativeDayOfWeek) dt = dt.AddDays(-1); return dt; } else { // Second, third and forth int relCount = 2; if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Third) relCount = 3; else if (repeatOnRelativeDayInMonth == eRelativeDayInMonth.Fourth) relCount = 4; DateTime dt = startDate.AddDays(cal.GetDaysInMonth(startDate.Year, startDate.Month) - startDate.Day); if (repeatOnMonths != eMonthRecurrence.All) AdjustForRepeatOnMonths(ref dt, repeatOnMonths); // Adjust for repeat on Months while (relCount > 0) { dt = dt.AddDays(1); if (dt.DayOfWeek == relativeDayOfWeek) relCount--; } return dt; } } throw new InvalidOperationException("Could not find the next relative date for monthly recurrence starting on " + startDate.ToString() + " RelativeDayInMonth=" + repeatOnRelativeDayInMonth.ToString() + " RelativeDayOfWeek=" + relativeDayOfWeek.ToString()); }
private void OnRepeatOnMonthsChanged(eMonthRecurrence oldValue, eMonthRecurrence newValue) { OnPropertyChanged(new PropertyChangedEventArgs("RepeatOnMonths")); }