【问题标题】:How to create recurring job for each first/second/third/fourth week on specific day of week?如何在一周中的特定日子为每个第一/第二/第三/第四周创建重复工作?
【发布时间】:2018-08-08 09:19:42
【问题描述】:

我正在寻找表达式,以通过 hangfire 在特定周数和星期几创建有效的重复 每月 工作,根据:

RecurringJob.AddOrUpdate 有两种方法可以创建 Cron 表达式(hangfire 的帮助类和自身的字符串表达式)帮助类包含每月表达式的方法,但问题是它只有天数和时间的参数,以及何时我正在寻找有效的表达我发现了以下主题:

Hangfire Cron expressions are not valid 我试图找到任何有效的方法来为我的目的创建表达式,但是当我尝试用 http://cron.schlitt.infohttps://crontab.guru(they 解析它们时,我发现的所有表达式都失败了,例如特定周的天数范围hangfire 用来解析表达式):

1-7 first week
8-14 second week
15-21 third week
22-28 forth week
29-31 fifth week

【问题讨论】:

    标签: c# cron hangfire


    【解决方案1】:

    据我了解,cron 表达式不能包含周数,请参阅下面的 cron 标准:

    minute (0-59)
    hour (0-23)
    day of the month (1-31)
    month of the year (1-12)
    day of the week (0-6 with 0=Sunday)
    

    话虽如此,但在不了解您的确切情况的情况下,这里有两种可能的解决方案:

    解决方案 1:

    忽略周数并计算天数:

            RecurringJob.AddOrUpdate(() => Execute(), "0 6 1,2,3,4,5,6,7 * *");// Run every morning @ 6 if day between 1 and 7
            RecurringJob.AddOrUpdate(() => Execute(), "0 6 8,9,10,11,12,13,14 * *");// Run every morning @ 6 if day between 8 and 14
            RecurringJob.AddOrUpdate(() => Execute(), "0 6 15,16,17,18,19,20,21 * *");// Run every morning @ 6 if day between 15 and 21
            RecurringJob.AddOrUpdate(() => Execute(), "0 6 22,23,24,25,26,27,28 * *");// Run every morning @ 6 if day between 22 and 28
            RecurringJob.AddOrUpdate(() => Execute(), "0 6 29,30,31 * *");// Run every morning @ 6 if day between 29 and 31
    

    解决方案 2:

    也可以根据您的业务需求解决问题的伪代码:

    每天 6 点运行一次的主要作业,如果适用,它将排队其他作业。

    static void Main(string[] args)
        {
            RecurringJob.AddOrUpdate(() => Execute(), "0 6 * * *");// Run every morning @ 6
        }
    
        private static void Execute()
        {
            int currentWeekNumber = GetWeekNumberOfMonth(DateTime.Now);
            int dayNumber = (int)DateTime.Now.DayOfWeek;
    
            if ((currentWeekNumber == 1) && (dayNumber == (int)DayOfWeek.Wednesday))
                BackgroundJob.Enqueue(() => Console.WriteLine("Week 1 Job"));
    
            if ((currentWeekNumber == 2) && (dayNumber == (int)DayOfWeek.Monday))
                BackgroundJob.Enqueue(() => Console.WriteLine("Week 2 Job"));
    
            if ((currentWeekNumber == 3) && (dayNumber == (int)DayOfWeek.Thursday))
                BackgroundJob.Enqueue(() => Console.WriteLine("Week 3 Job"));
    
            if ((currentWeekNumber == 4) && (dayNumber == (int)DayOfWeek.Friday))
                BackgroundJob.Enqueue(() => Console.WriteLine("Week 4 Job"));
        }
    
    
        private static int GetWeekNumberOfMonth(DateTime date)
        {
            date = date.Date;
            DateTime firstMonthDay = new DateTime(date.Year, date.Month, 1);
            DateTime firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
            if (firstMonthMonday > date)
            {
                firstMonthDay = firstMonthDay.AddMonths(-1);
                firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
            }
            return (date - firstMonthMonday).Days / 7 + 1;
        }    
    

    【讨论】:

    • 不错的解决方案作为一种解决方法,但我相信仍然可能存在具有有效表达的解决方案,因为我们可以使用天数来识别特定周的星期和星期几,也许我'我不对,还是谢谢。
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2021-11-05
    • 2021-08-21
    • 2015-06-02
    • 1970-01-01
    • 2021-09-29
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多