一篇学会cron表达式

简介: # 1、定义Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中,用于在指定的时间执行预定的任务。Cron表达式由6个字段组成,每个字段通过空格分隔开。在本文中,我们将学习如何理解和编写Cron表达式。Cron表达式的格式如下:```javascript* * * * * * | | | | | | | | | | | +-- 星期(周日=0 或 7) | | | | +---- 月份(1-12) | | | +------ 日期(1-31) | | +-------- 小时(0-23) | +-------

1、定义

Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中,用于在指定的时间执行预定的任务。Cron表达式由6个字段组成,每个字段通过空格分隔开。
在本文中,我们将学习如何理解和编写Cron表达式。
Cron表达式的格式如下:

* * * * * *  
| | | | | |  
| | | | | +-- 星期(周日=07| | | | +---- 月份(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库

QQ截图20231128192231.png

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、结果

QQ截图20231128192938.png

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

1、安装Quartz库

QQ截图20231128193513.png

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、结果

QQ截图20231128194037.png

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

目录
相关文章
|
9月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1184 4
|
机器学习/深度学习 人工智能 自然语言处理
全新开源通义千问Qwen3上架阿里云百炼
Qwen3是Qwen系列大型语言模型的最新成员,作为混合推理模型,其旗舰版本Qwen3-235B-A22B在代码、数学和通用能力测试中表现出色,与顶级模型DeepSeek-R1、o1、o3-mini等相比具有竞争力。小型MoE模型Qwen3-30B-A3B激活参数仅为QwQ-32B的10%,性能更优,甚至小规模模型Qwen3-4B也能匹敌Qwen2.5-72B-Instruct。Qwen3支持思考与非思考两种模式,可根据任务需求灵活调整推理深度,并支持119种语言,Qwen3在推理、工具调用及多语言处理等方面显著提升,目前已开源并在阿里云百炼平台上线,提供便捷体验。
3786 0
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
Qwen3:小而强,思深,行速
Qwen3(千问3)于北京时间4月29日凌晨发布,是Qwen系列大型语言模型的最新成员,具备全系列、开源最强、混合推理等特性。它包括两款MoE模型(Qwen3-235B-A22B和Qwen3-30B-A3B)及六个Dense模型,支持119种语言。Qwen3在代码、数学和通用能力测试中超越行业顶尖模型,如DeepSeek-R1和Grok-3。其旗舰版Qwen3-235B-A22B仅需4张H20即可本地部署,成本为DeepSeek-R1的35%。此外,Qwen3原生支持思考模式与非思考模式切换,降低复杂任务门槛,并支持MCP协议优化Agent架构。
7357 2
|
Unix Linux
Cron介绍,以及常见的cron表达式
Cron介绍,以及常见的cron表达式
1287 0
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
2849 1
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
小程序
java--微信小程序发送模板消息
java--微信小程序发送模板消息
642 0
|
安全 Java API
实现跨域请求:Spring Boot后端的解决方案
本文介绍了在Spring Boot中处理跨域请求的三种方法:使用`@CrossOrigin`注解、全局配置以及自定义过滤器。每种方法都适用于不同的场景和需求,帮助开发者灵活地解决跨域问题,确保前后端交互顺畅与安全。
1942 0
|
Docker 容器
Docker服务启动失败报错:Job for docker.service failed because the control process exited with error code.
Docker服务启动失败报错:Job for docker.service failed because the control process exited with error code.
cron表达式
cron表达式
758 0
|
Docker 容器
docker设置国内镜像源
docker设置国内镜像源
40510 5