当前位置: 首页 > news >正文

cron定时任务

cron定时任务

一、Cron表达式的定义

基础结构

Cron表达式是由空格分隔的6或7个字段组成的字符串,格式为:

秒 分 时 日 月 星期 [年]

其中,年通常可以被省略

字段说明

  1. (0-59)

    秒字段表示每分钟的哪一秒执行任务。取值范围为0-59。

    例如,如果要每分钟的第30秒执行任务,可以使用30 * * * * ?的格式。

  2. (0-59)

    分字段表示每小时的哪一分钟执行任务。取值范围为0-59。

    例如,如果要每小时的第15分钟执行任务,可以使用* 15 * * * ?的格式。

  3. (0-23)

    时字段表示每天的哪一个小时执行任务。取值范围为0-23。

    例如,如果要每天的凌晨2点执行任务,可以使用* * 2 * * ?的格式。

  4. (1-31)

    日字段表示每月的哪一天执行任务。取值范围为1-31。

    例如,如果要每月的第一天执行任务,可以使用* * * 1 * ?的格式。

  5. (1-12或JAN-DEC)

    月字段表示每年的哪一个月执行任务。取值范围为 1-12 或用字符串 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC 表示。

    例如,如果要每年的1月1日执行任务,可以使用* * * 1 1 ?的格式。

  6. 星期(0-6或SUN-SAT,0/7为周日)

    周字段表示每周的哪一天执行任务。取值范围为0-6,也可以用字符串 SUN, MON, TUE, WED, THU, FRI, SAT 表示,其中0表示周日,1表示周一,以此类推。例如,如果要每周的周五执行任务,可以使用* * * * * 5 ?的格式。

二、特殊字符

字符含义示例
*表示所有取值范围内的值,可解读为 “每* * * * * * 每秒执行
?不指定值(仅用于日和星期冲突时)0 0 5 * ? 每天5点
-范围0 9-17 * * * 9点到17点每小时
/步长*/5 * * * * 每5分钟
,枚举0 0 8,12,18 * * 每天8/12/18点
L最后一天0 0 L * * 每月最后一天
W最近工作日0 0 15W * * 15日最近的工作日
#用于指定某个月份的第几个周几,只能作用于 “周” 上0 0 * * 5#2 每月第2个周五

以下是Cron表达式中特殊字符的详细解析(基于2025年最新实践):

1、核心特殊字符

  1. *(通配符)

    • 匹配该字段所有有效值
    • 示例:0 * * * * ? 每分钟的0秒触发
  2. ?(不指定)

    • 仅用于星期字段,解决两者冲突
    • 示例:0 0 12 1 * ? 每月1日中午执行(忽略星期)
  3. /(步长)

    • 表示时间间隔增量
    • 示例:0/15 * * * * ? 每15秒触发

2、范围与枚举

  1. ,(枚举)

    • 指定多个离散值
    • 示例:0 0 8,12,18 * * ? 每天8/12/18点执行
  2. -(范围)

    • 定义连续时间段
    • 示例:0 0 9-17 * * MON-FRI 工作日9-17点每小时执行

3、高级逻辑字符

  1. L(最后一天)

    • 字段:L表示月末最后一天
    • 星期字段:L表示当月最后一个周日
    • 示例:0 0 12 L * ? 每月最后一天中午执行
  2. W(最近工作日)

    • 自动调整到最近的工作日(周一至周五)
    • 示例:0 0 12 15W * ? 每月15日最近的工作日执行
  3. #(第N个星期几)

    • 指定某月第N个特定星期
    • 示例:0 0 12 ? * 5#2 每月第二个周五中午执行

4、特殊组合

组合说明示例
LW当月最后一个工作日0 0 12 LW * ?
L-3月末倒数第3天0 0 12 L-3 * ?
5W5日最近的工作日0 0 12 5W * ?

三、预定义规则

1、核心预定义规则

  1. 基础周期规则

    • @yearly@annually
      每年1月1日 00:00 执行(等效于0 0 1 1 *
    • @monthly
      每月1日 00:00 执行(等效于0 0 1 * *
    • @weekly
      每周日 00:00 执行(等效于0 0 * * 0
    • @daily@midnight
      每天 00:00 执行(等效于0 0 * * *
    • @hourly
      每小时整点执行(等效于0 * * * *
  2. 自定义间隔规则

    • @every <duration>
      支持任意时间间隔(需符合time.ParseDuration格式)
      示例:
      @every 1h30m10s  // 每1小时30分钟10秒
      @every 5m        // 每5分钟
      @every 10s       // 每10秒
      

2、特殊说明

  1. 执行逻辑差异

    • @every的间隔从任务开始运行时计算(非自然时间对齐)
      例如:@every 1h若任务耗时3分钟,则下次执行在57分钟后
  2. 时区处理
    预定义规则默认使用本地时区,可通过以下方式修改:

    // 方法1:全局设置时区
    loc, _ := time.LoadLocation("Asia/Shanghai")
    c := cron.New(cron.WithLocation(loc))// 方法2:单任务指定时区
    c.AddFunc("CRON_TZ=Asia/Tokyo @daily", task)
    

3、使用示例

package main
import ("fmt""github.com/robfig/cron/v3"
)
func main() {c := cron.New()// 添加预定义规则任务c.AddFunc("@hourly", func() { fmt.Println("每小时执行") })c.AddFunc("@every 30m", func() { fmt.Println("每30分钟执行") })c.Start()defer c.Stop()select{}
}

相关文章:

  • element ui el-col的高度不一致导致换行
  • 论文阅读:2024 arxiv HybridFlow: A Flexible and Efficient RLHF Framework
  • x修改ssh版本号9.9可以躲过漏洞扫描器扫描
  • 精通线程池:业务场景中的实践、优化与监控
  • Java 面向对象编程:封装及其各种用法详解
  • 工业摄像头通过USB接口实现图像
  • A. Everybody Likes Good Arrays!
  • 视频转gif在线工具-免费快捷
  • 如何创建成员内部类数组
  • 硬件工程师面试常见问题(8)
  • SQL语法基础,进阶,高级sql语句学习
  • 山东大学软件学院项目实训-基于大模型的模拟面试系统-网页图片显示问题
  • Hutool TreeUtil快速构建树形数据结构
  • 简易版2D我的世界C++程序(有点BUG,但是可以玩!!!)
  • 教育领域的AIGC革命:构建多模态智能教学系统
  • Java 安全:如何保护敏感数据?
  • pytorch python常用指令
  • GoLang基础
  • Java ThreadLocal与内存泄漏
  • SD模型的评估指标(挖坑中..)
  • 孟泽:我们简化了历史,因此也简化了人性
  • 政企研合力,科学监测分析服务消费
  • 魔都眼·上海车展④|奔驰宝马保时捷……全球豪车扎堆首秀
  • 国防部:菲挑衅滋事违背地区国家共同利益
  • 预订假期酒店却被告知无法入住,去哪儿:对违规酒店予以处罚
  • 上海一小学百名学生齐聚图书馆:纸质书的浪漫AI无法取代