Нет способа сделать это с помощью выражений cron.В моем случае мне понадобились вхождения, чтобы сделать подсчет стоимости.Эта функция, которую я сделал, кажется, работает нормально:
public List<DateTime> GetOccurrencesInWeeksInterval(DateTime start, DateTime end)
{
var ret = new List<DateTime>();
DateTime? lastDate = null;
int weekInterval = _rptConfig.Interval;
CronExpression expression = CronExpression.Parse(this.GetCronExpression()); // this would return something like "0 9 * * 1,3,5"
var dates = expression.GetOccurrences(start, end).ToList();
if (weekInterval == 1) {
return dates;
}
if (dates.Any())
{
foreach (var date in dates)
{
if (lastDate == null)
{
ret.Add(date);
lastDate = date;
}
else
{
var weekDiff = HelperFunctions.GetWeekDiff(lastDate.Value, date);
if (weekDiff == 0)
{
ret.Add(date);
}
else if (weekDiff > 0 && (weekDiff % weekInterval) == 0)
{
ret.Add(date);
}
}
}
}
return ret;
}
Это функция GetWeekDiff
:
/// <summary>
/// https://stackoverflow.com/questions/49924085/week-difference-between-2-dates-in-c-sharp#49924454
/// </summary>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
/// <returns></returns>
public static int GetWeekDiff(DateTime dtStart, DateTime dtEnd, DayOfWeek startOfWeek = DayOfWeek.Monday) {
//===============================================
var diff = dtEnd.Subtract(dtStart);
var weeks = (int)diff.Days / 7;
// need to check if there's an extra week to count
var remainingDays = diff.Days % 7;
var cal = CultureInfo.InvariantCulture.Calendar;
var d1WeekNo = cal.GetWeekOfYear(dtStart, CalendarWeekRule.FirstFullWeek, startOfWeek);
var d1PlusRemainingWeekNo = cal.GetWeekOfYear(dtStart.AddDays(remainingDays), CalendarWeekRule.FirstFullWeek, startOfWeek);
if (d1WeekNo != d1PlusRemainingWeekNo)
weeks++;
return weeks;
}
Надеюсь, это кому-то поможет, потому что я понял, что это довольнообщий вопрос.