public void Format(CrontabField field, TextWriter writer, bool noNames) { if (field == null) { throw new ArgumentNullException(nameof(field)); } if (writer == null) { throw new ArgumentNullException(nameof(writer)); } var next = field.GetFirst(); var count = 0; while (next != -1) { var first = next; int last; do { last = next; next = field.Next(last + 1); } while (next - last == 1); if (count == 0 && first == _minValue && last == _maxValue) { writer.Write('*'); return; } if (count > 0) { writer.Write(','); } if (first == last) { FormatValue(first, writer, noNames); } else { FormatValue(first, writer, noNames); writer.Write('-'); FormatValue(last, writer, noNames); } count++; } }
public DateTime GetNextOccurrence(DateTime baseTime, DateTime endTime) { const int nil = -1; var baseYear = baseTime.Year; var baseMonth = baseTime.Month; var baseDay = baseTime.Day; var baseHour = baseTime.Hour; var baseMinute = baseTime.Minute; var endYear = endTime.Year; var endMonth = endTime.Month; var endDay = endTime.Day; var year = baseYear; var month = baseMonth; var day = baseDay; var hour = baseHour; var minute = baseMinute + 1; minute = _minutes.Next(minute); if (minute == nil) { minute = _minutes.GetFirst(); hour++; } hour = _hours.Next(hour); if (hour == nil) { minute = _minutes.GetFirst(); hour = _hours.GetFirst(); day++; } else if (hour > baseHour) { minute = _minutes.GetFirst(); } day = _days.Next(day); RetryDayMonth: if (day == nil) { minute = _minutes.GetFirst(); hour = _hours.GetFirst(); day = _days.GetFirst(); month++; } else if (day > baseDay) { minute = _minutes.GetFirst(); hour = _hours.GetFirst(); } month = _months.Next(month); if (month == nil) { minute = _minutes.GetFirst(); hour = _hours.GetFirst(); day = _days.GetFirst(); month = _months.GetFirst(); year++; } else if (month > baseMonth) { minute = _minutes.GetFirst(); hour = _hours.GetFirst(); day = _days.GetFirst(); } var dateChanged = day != baseDay || month != baseMonth || year != baseYear; if (day > 28 && dateChanged && day > Calendar.GetDaysInMonth(year, month)) { if (year >= endYear && month >= endMonth && day >= endDay) { return(endTime); } day = nil; goto RetryDayMonth; } var nextTime = new DateTime(year, month, day, hour, minute, 0, 0, baseTime.Kind); if (nextTime >= endTime) { return(endTime); } if (_daysOfWeek.Contains((int)nextTime.DayOfWeek)) { return(nextTime); } return(GetNextOccurrence(new DateTime(year, month, day, 23, 59, 0, 0, baseTime.Kind), endTime)); }