예제 #1
0
 private static void AdjustForRepeatOnMonths(ref DateTime dt, eMonthRecurrence repeatOnMonths)
 {
     while (((int)Math.Pow(2, (dt.Month - 1)) & (int)repeatOnMonths) == 0)
         dt = dt.AddMonths(1);
 }
예제 #2
0
        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"));
 }