예제 #1
0
        private void CalculateNextScheduledDay(ScheduleTime next)
        {
            CronValue scheduledDay = DayOfMonthField.GetNext(next.Day);

            if (scheduledDay == CronValue.Wrapped)
            {
                WrapToNextMonth(next);
            }
            else if (scheduledDay.Value > next.Day)
            {
                SetStartOfDay(next, scheduledDay);
            }
            else
            {
                next.Day = scheduledDay.Value;
            }
        }
예제 #2
0
        private void CalculateNextScheduledHour(ScheduleTime next)
        {
            CronValue scheduledHour = HourField.GetNext(next.Hour);

            if (scheduledHour == CronValue.Wrapped)
            {
                WrapToNextDay(next);
            }
            else if (scheduledHour.Value > next.Hour)
            {
                SetStartOfHour(next, scheduledHour);
            }
            else
            {
                next.Hour = scheduledHour.Value;
            }
        }
예제 #3
0
        public DateTime GetNextOccurrence(DateTime baseTime)
        {
            var nextScheduleTime = new ScheduleTime(baseTime.AddMinutes(1));

            return GetNextOccurrence(nextScheduleTime);
        }
예제 #4
0
 private static bool MonthContainsDate(ScheduleTime nextScheduleTime)
 {
     return nextScheduleTime.Day <= Calendar.GetDaysInMonth(nextScheduleTime.Year, nextScheduleTime.Month);
 }
예제 #5
0
 private void WrapToNextHour(ScheduleTime next)
 {
     next.Hour++;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #6
0
 private void WrapToNextYear(ScheduleTime next)
 {
     next.Year++;
     next.Month = MonthField.GetFirst().Value;
     next.Day = DayOfMonthField.GetFirst().Value;
     next.Hour = HourField.GetFirst().Value;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #7
0
 private DateTime TryCorrectScheduleForDaysInMonth(ScheduleTime nextScheduleTime)
 {
     try
     {
         return CorrectScheduleForDaysInMonth(nextScheduleTime);
     }
     catch (ArgumentOutOfRangeException ex)
     {
         throw new CronException(ErrorMessages.NoScheduleFound, ex);
     }
 }
예제 #8
0
 private void WrapToNextDay(ScheduleTime next)
 {
     next.Day++;
     next.Hour = HourField.GetFirst().Value;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #9
0
 private void SetStartOfHour(ScheduleTime next, CronValue scheduledHour)
 {
     next.Hour = scheduledHour.Value;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #10
0
 private void SetStartOfMonth(ScheduleTime next, CronValue scheduledMonth)
 {
     next.Month = scheduledMonth.Value;
     next.Day = DayOfMonthField.GetFirst().Value;
     next.Hour = HourField.GetFirst().Value;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #11
0
 private void SetStartOfDay(ScheduleTime next, CronValue scheduledDay)
 {
     next.Day = scheduledDay.Value;
     next.Hour = HourField.GetFirst().Value;
     next.Minute = MinuteField.GetFirst().Value;
 }
예제 #12
0
        private DateTime GetNextOccurrence(ScheduleTime nextScheduleTime)
        {
            CalculateNextScheduledMinute(nextScheduleTime);
            CalculateNextScheduledHour(nextScheduleTime);
            CalculateNextScheduledDay(nextScheduleTime);
            CalculateNextScheduledMonth(nextScheduleTime);

            var nextTime = TryCorrectScheduleForDaysInMonth(nextScheduleTime);
            return CorrectScheduleForDayOfWeek(nextTime);
        }
예제 #13
0
        private DateTime CorrectScheduleForDaysInMonth(ScheduleTime nextScheduleTime)
        {
            for (int i = 0; i <= MaxDayInMonthFixAttempts; i++)
            {
                if (MonthContainsDate(nextScheduleTime))
                {
                    return nextScheduleTime.ToDateTime();
                }

                WrapToNextMonth(nextScheduleTime);
                CalculateNextScheduledMonth(nextScheduleTime);
            }

            throw new CronException(ErrorMessages.NoScheduleFound);
        }
예제 #14
0
        private void CalculateNextScheduledMonth(ScheduleTime next)
        {
            CronValue scheduledMonth = MonthField.GetNext(next.Month);

            if (scheduledMonth == CronValue.Wrapped)
            {
                WrapToNextYear(next);
            }
            else if (scheduledMonth.Value > next.Month)
            {
                SetStartOfMonth(next, scheduledMonth);
            }
            else
            {
                next.Month = scheduledMonth.Value;
            }
        }
예제 #15
0
        private void CalculateNextScheduledMinute(ScheduleTime next)
        {
            CronValue scheduledMinute = MinuteField.GetNext(next.Minute);

            if (scheduledMinute == CronValue.Wrapped)
            {
                WrapToNextHour(next);
            }
            else
            {
                next.Minute = scheduledMinute.Value;
            }
        }