Выражение Asp.Net Core Hangfire Cronos повторяется каждые x недель - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над системой задач, в которой вы можете создавать повторяющиеся задачи, и есть один случай, который мне нужен, чтобы выяснить:

enter image description here

Я использую эту библиотеку , чтобы выяснить, когда создавать задачи, и спроецировать время, которое она проведет в ближайшие 28 дней.Например, каждый день в 9:

CronExpression expression = CronExpression.Parse("0 9 * * *");

Но, читая о выражении Cronos, я все еще не мог понять, как получить выражение, которое будет повторяться каждые 3 недели.В какие дни недели все в порядке, но каждые x недель я не могу понять.

Можете ли вы мне помочь, пожалуйста?Спасибо

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Нет способа сделать это с помощью выражений 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;

    }

Надеюсь, это кому-то поможет, потому что я понял, что это довольнообщий вопрос.

0 голосов
/ 03 октября 2018

Я не думаю, что вы можете запланировать cron на основе недель, см. Ниже: я бы предложил запланировать одну и ту же работу на разные дни месяца.

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
│ │ │ │ │                                   7 is also Sunday on some systems)
│ │ │ │ │
│ │ │ │ │
* * * * * command to execute

https://en.wikipedia.org/wiki/Cron

...