private void OnRepeatOnRelativeDayInMonthChanged(eRelativeDayInMonth oldValue, eRelativeDayInMonth newValue) { OnPropertyChanged(new PropertyChangedEventArgs("RepeatOnRelativeDayInMonth")); }
/// <summary> /// AddRRuleByDay /// </summary> /// <param name="sb"></param> /// <param name="rday"></param> /// <param name="dow"></param> private void AddRRuleByDay(StringBuilder sb, eRelativeDayInMonth rday, DayOfWeek dow) { sb.Append(";BYDAY="); switch (rday) { case eRelativeDayInMonth.First: sb.Append("1"); break; case eRelativeDayInMonth.Second: sb.Append("2"); break; case eRelativeDayInMonth.Third: sb.Append("3"); break; case eRelativeDayInMonth.Fourth: sb.Append("4"); break; case eRelativeDayInMonth.Last: sb.Append("-1"); break; } switch (dow) { case DayOfWeek.Sunday: sb.Append("SU"); break; case DayOfWeek.Monday: sb.Append("MO"); break; case DayOfWeek.Tuesday: sb.Append("TU"); break; case DayOfWeek.Wednesday: sb.Append("WE"); break; case DayOfWeek.Thursday: sb.Append("TH"); break; case DayOfWeek.Friday: sb.Append("FR"); break; default: sb.Append("SA"); break; } }
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()); }