DateTime GetRuntimeForMonthly(DateTime now, MonthlySchedule schedule) { var reference = now; for (;;) { var time = new DateTime(reference.Year, reference.Month, 1); time = time.AddMonths(AdjustEvery(reference.Month, schedule.Every)); switch (schedule.RelativeTo) { case JobRelativeTo.BeginOfTheMonth: time = time.AddDays(schedule.DayOffset); break; case JobRelativeTo.EndOfTheMonth: time = time.AddMonths(1).AddDays(-(schedule.DayOffset + 1)); break; case JobRelativeTo.FirstSundayOfTheMonth: if (time.DayOfWeek != DayOfWeek.Sunday) time = time.AddDays(7 - ((int) time.DayOfWeek)); time = time.AddDays(schedule.DayOffset); break; } time = time.AddMinutes(schedule.RunAt.Hour*60 + schedule.RunAt.Minute); if (time > now) return time; reference = reference.AddMonths(1); } }
public JobSchedule() { ScheduleType = JobScheduleType.Weekly; Daily = new DailySchedule(); Weekly = new WeeklySchedule(); Monthly = new MonthlySchedule(); }