cron在线表达式使用运行详细解析
概念
cron在线表达式是一种用于指定任务在某个时间点或周期性执行的字符串表达式。它包含6个或7个域,每个域代表不同的含义,从左到右依次为”秒 分 时 日 月 星期几 年”,其中年不是必须的; cron表达式的配置简洁方便,因此在定时调度任务中被广泛使用。
参数
cron表达式包含6个或7个参数,每个参数代表不同的时间单位和取值范围;
- 秒(0-59)
- 分钟(0-59)
- 小时(0-23)
- 日(1-31)
- 月(1-12 或 JAN-DEC)
- 星期几(0-6 或 SUN-SAT)
- 年(可选,1970-2099)
其中,星期几和日两个参数只能出现一个或者同时出现。其它参数通过空格或逗号来区分,用“”代表所有取值范围,用”?”代表不指定,用”/”表示间隔时间。
举例与特殊符号详解
举例:
- “0 0 8 * * *” 表示每天上午8点执行任务。
- “0 0/30 9-17 * * *” 表示在每天9点到17点之间,每隔30分钟执行一次任务。
- “0 0 12 ? * WED” 表示每周三中午12点执行任务。
- “0 0 10 L * ?” 表示每个月的最后一天上午10点执行任务。
- “0 0 3-5 * * *” 表示每天凌晨3点到5点之间,每小时执行一次任务。
- “0 15 10 L * ?” 表示每个月的最后一天上午10:15分执行任务。
特殊符号:
*
(通配符):匹配任意值,例如* * * * * ?
表示每秒执行一次任务。,
(列表):用于指定多个取值,例如0 0 6,12,18 * * ?
表示每天6点、12点和18点执行任务。-
(范围):用于指定一个范围内的取值,例如0 0 9-17 * * MON-FRI
表示周一至周五的9点到17点之间每小时执行一次任务。/
(步长):用于指定一个取值的步长,例如0 */30 * * * ?
表示每30分钟执行一次任务。?
(无意义占位符):用于指定一个字段没有具体的取值,只能与其他字段一起使用,例如0 0 12 ? * MON-FRI
表示周一至周五中午12点执行任务。#
(日历偏移量):用于指定某个月份的第几个周几,例如0 0 0 ? * 3#1
表示每个月的第一个星期三执行任务。L
(Last):表示某个指定时间内的最后一天,比如0 0 L * * ?
表示每月的最后一天执行任务。W
(Weekday):表示距离指定日期最近的工作日,比如0 0 0 15W * ?
表示当月第15个工作日执行任务。如果15号是工作日,则执行任务;如果15号是周末,则任务会提前到最近的工作日即14号执行。C
(Calendar):表示距离指定日期最近的那个日子,比如0 0 0 1W * ?
表示当月的第一个工作日执行任务。如果1号是工作日,则执行任务;如果1号是周末,则任务会延后到最近的工作日即2号执行。
其中,W
和C
的区别在于W
只能用在日字段上,表示距离指定日期最近的工作日; 而C
可以用在月、日、星期字段上,表示距离指定日期最近的那个日子。同时,C
还可以与星期字段结合使用,比如0 0 0 ? * 2#2
表示每月第二个星期二执行任务;
C#中使用cron表达式的方法和示例
在 C# 中,可以使用 Quartz.NET 这个开源的定时任务库来实现 cron 表达式的调度。使用 Quartz.NET 需要引入对应的 NuGet 包,在项目中添加 using Quartz namespace 后即可使用。
以下是一个简单的示例代码,其中配置文件用到了 Quartz 自带的 CronScheduleBuilder 类:
using Quartz;
using Quartz.Impl;
class Program
{
static void Main(string[] args)
{
// 创建调度器工厂
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取调度器
IScheduler scheduler = schedulerFactory.GetScheduler().Result;
// 创建作业
IJobDetail job = JobBuilder.Create<MyJob>()
.WithIdentity(“job1”, “group1”)
.Build();
// 创建触发器
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(“trigger1”, “group1”)
.WithCronSchedule(“0/5 * * * * ?”) // 每 5 秒执行一次
.Build();
// 将作业和触发器注册到调度器中
scheduler.ScheduleJob(job, trigger).Wait();
// 开始调度器(定时任务)
scheduler.Start().Wait();
Console.ReadKey();
}
}
public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine(“Hello, World!”);
return Task.CompletedTask;
}
}