1、定义

Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中,用于在指定的时间执行预定的任务。Cron表达式由6个字段组成,每个字段通过空格分隔开。

在本文中,我们将学习如何理解和编写Cron表达式。

Cron表达式的格式如下:

* * * * * *
| | | | | |
| | | | | +-- 星期(周日=0 或 7)
| | | | +---- 月份(1-12)
| | | +------ 日期(1-31)
| | +-------- 小时(0-23)
| +---------- 分钟(0-59)
+------------ 秒(0-59)

每个字段可以使用数字来表示具体的值,也可以使用一些特殊字符来表示范围、递增等。

下面是一些常用的特殊字符:

:代表所有可能的值,例如在小时字段中表示每一个小时。

?:在日期和星期字段中,表示不指定值。

-:表示范围,例如在小时字段中1-3表示1点到3点。

,:表示列举值,例如在小时字段中1,3,5表示1点、3点和5点。

/:表示递增,例如在分钟字段中*/15表示每15分钟。

下面是一些示例Cron表达式:

1)每分钟的第30秒执行任务:

30 * * * * *

2)每小时的第30分钟执行任务:

* 30 * * * *

3)每天的凌晨1点执行任务:

0 1 * * *

4)每月的第1天的凌晨1点执行任务:

0 1 1 * *

5)每周一的凌晨1点执行任务:

0 1 * * 1

以上只是Cron表达式的一些基本示例,你可以根据自己的需求灵活组合各个字段来定义复杂的定时任务。需要注意的是,Cron表达式的具体语法和支持的特殊字符可能因不同的系统或工具而有所差异,因此在实际使用时最好查阅相关文档进行参考。

2、.NET代码举例

以下是一个使用.NET代码的例子,演示如何创建和执行一个Cron表达式。

首先,你需要安装一个用于解析和执行Cron表达式的.NET库。常用的库是NCrontab和Quartz,你可以通过NuGet包管理器将其添加到你的项目中。

安装完成后,你可以使用以下代码创建一个Cron表达式,并生成一个对应的定时任务。

1)NCrontab

1、安装NCrontab库

2、NCrontabUtil工具类

/// <summary>
/// NCrontab解析Cron表达式
/// 不支持秒级
/// </summary>
public static class NCrontabUtil
{
/// <summary>
/// 执行NCrontab解析
/// </summary>
/// <param name="cronExpression">Cron表达式</param>
public static void ExecuteNCrontab(string cronExpression)
{
// 解析Cron表达式
CrontabSchedule schedule = CrontabSchedule.Parse(cronExpression); // 获取当前时间
DateTime currentTime = DateTime.Now; // 计算下一个执行时间
DateTime nextOccurrence = schedule.GetNextOccurrence(currentTime); Console.WriteLine("下一个执行时间:" + nextOccurrence.ToString()); // 在下一个执行时间执行任务
// 这里只是简单打印一条消息作为示例任务
Action task = () => Console.WriteLine("执行任务...");
task.Invoke();
}
}

3、调用

// 创建一个Cron表达式
string cronExpression = ""; // NCrontab 不支持秒级
// 在每小时的第一分钟执行任务。这个表达式具体表示在每小时的第一分钟(例如01:01、02:01、03:01等)触发执行相应的任务
// 其他字段的值使用星号()表示,意味着对应字段的所有可能值都被匹配,即任务在每个小时都会执行
cronExpression = "1 * * * *";
NCrontabUtil.ExecuteNCrontab(cronExpression);

4、结果

2)Quartz(推荐使用,支持6为表达式->支持秒级)

1、安装Quartz库

2、QuartzUtil工具类

/// <summary>
/// Quartz解析Cron表达式
/// 支持秒级
/// </summary>
public static class QuartzUtil
{
/// <summary>
/// 执行Quartz解析
/// </summary>
/// <param name="cronExpression">Cron表达式</param>
public async static void ExecuteQuartz(string cronExpression)
{
// 创建调度器工厂
var schedulerFactory = new StdSchedulerFactory();
// 获取调度器 .ConfigureAwait(false)避免死锁,下同
var scheduler = await schedulerFactory.GetScheduler().ConfigureAwait(false);
// 开启调度器
await scheduler.Start().ConfigureAwait(false);
// 创建作业
var job = JobBuilder.Create<MyJob>()
.WithIdentity("myJob")
.Build();
// 创建触发器,并设置CRON表达式
var trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.WithCronSchedule(cronExpression)
.Build(); // 将作业和触发器关联到调度器中
await scheduler.ScheduleJob(job, trigger).ConfigureAwait(false); // 保持主程序的运行,以便调度器持续执行任务
Console.WriteLine("Press any key to exit...");
Console.ReadKey(); // 关闭调度器
await scheduler.Shutdown().ConfigureAwait(false);
} // 创建作业类
public class MyJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// 在这里编写每秒要执行的代码
if (context.NextFireTimeUtc.HasValue)
{
Console.WriteLine("执行任务中...下一次执行任务时间" + context.NextFireTimeUtc.Value.ToLocalTime().DateTime.ToString("yyyy-MM-dd HH:mm:ss"));
}
else
{
Console.WriteLine("执行任务中...下一次执行任务时间未知");
}
await Task.CompletedTask;
}
}
}

3、调用

// 创建一个Cron表达式
string cronExpression = ""; // Quartz 支持秒级
// 每秒执行一次的CRON表达式
cronExpression = "0/1 * * * * ?";
QuartzUtil.ExecuteQuartz(cronExpression);

4、结果

希望本文能帮助你学会理解和编写Cron表达式,以便在系统中实现定时任务的自动化执行。

一篇学会cron表达式的更多相关文章

  1. 基于Spring的最简单的定时任务实现与配置(三)--番外篇 cron表达式的相关内容

    本来这篇文章是会跟本系列的前两篇文章一起发布的.但是,昨天在找资料总结的时候遇到了一点意外,就延后了一些. 本篇的内容主要参考了 这篇博文:http://www.cnblogs.com/junrong ...

  2. 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)

    前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出 CronTrigger 这个重要人物了. Cro ...

  3. Quartz.net的cron表达式

    写在前面 前面有一篇文章用到了quartz.net,在设置定时时间的时候,使用了cron表达式,这里记录几种常见设置方式,方便对照使用. 详情 在这篇文章:Quartz.Net在windows服务中的 ...

  4. Java EE学习——Quartz的Cron表达式

    经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...

  5. Quartz.net 定时任务之Cron表达式

    一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...

  6. Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. cron校验的 ...

  7. .net core 实现基于 cron 表达式的任务调度

    .net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...

  8. 根据Cron表达式,通过Spring自带的CronSequenceGenerator类获取下次执行时间

    Cron表达式通常用于执行一些定时任务,在本篇文章中,暂时不会记录如何根据Cron表达式来执行一些定时任务.本章主要的目的是根据Cron表达式,通过Spring自带的CronSequenceGener ...

  9. Cron表达式,springboot定时任务

    详细请看这篇博客 参考:https://blog.csdn.net/belonghuang157405/article/details/83410197 Cron表达式是一个字符串,字符串以5或6个空 ...

  10. quartz.net 时间表达式----- Cron表达式详解

    序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...

随机推荐

  1. linux编译安装nginx

    前言 系统:centos7和debian11均验证可行 本文将nginx默认支持的编译参数都加上了,所以需要的依赖比较多,酌情配置. 步骤 假设安装在/usr/local/nginx,创建安装目录 m ...

  2. 《代码整洁之道 Clean Code》学习笔记 Part 1

    前段时间在看<架构整洁之道>,里面提到了:构建一个好的软件系统,应该从写整洁代码做起.毕竟,如果建筑使用的砖头质量不佳,再好的架构也无法造就高质量的建筑.趁热打铁,翻出<代码整洁之道 ...

  3. win11安装ubuntu(by wsl2)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本机情况 省吃俭用入手了ThinkPad T14,打算 ...

  4. 企业级低代码平台,通用代码生成平台,Java开源项目(附源码)

    项目介绍 Jeecg-Boot 是一款基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design.强大的代码生成器 ...

  5. LeetCode279:完全平方数,动态规划解法超过46%,作弊解法却超过97%

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇概览 这是道高频面试题,值得一看 首先, ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (100)-- 算法导论9.3 6题

    六.用go语言,对一个包含n个元素的集合来说,k分位数是指能把有序集合分成k个等大小集合的第k-1个顺序统计量.给出一个能找出某一集合的k分位数的 O(nlgk)时间的算法. 文心一言: 要找到一个集 ...

  7. Python基础合集

    入门介绍 01.python由来与发展介绍 02.WEB项目开发流程 第一篇 markdown编辑器 01.markdown基本语法 02.Typora简介与安装 03.Windows上gitee+T ...

  8. MySQL误删恢复方法1

    MySQL不同于oracle,没有闪回查询这类概念,但网上流传几个闪回的开源工具如 binglog2sql.MyFlash,可以使用binglog日志进行误操作数据的恢复. 笔者以前测试过 bingl ...

  9. 02-oracle11g rac RMAN备份恢复至单机(未验证)

    在一节点上进行全备确定备份路径,并赋予属组mkdir /rmanbackupchown oracle:oinsatll /rmanbackup进入rman进行全备rman target /run{al ...

  10. 【PHP正则表达式】

    [PHP正则表达式] 最近写题总是遇到php正则表达式的匹配函数,于是进行一个总结. 1.什么是正则表达式 是php在进行搜索时用于匹配的模式字符串.一般用于php对特定字符序列的替换和搜索. 2.正 ...