Cron 表达式: 一套用于指定定时任务的表达式

Cron 是一种用于设置定期执行任务的表达式。最早出现于 Unix 操作系统,crontab 软件就是一款使用这套语法的任务管理工具,常用于备份系统或清理日志。

现在,Cron 表达式已被广泛地应用于各种操作系统和应用程序中。平时看到的像是 0 0 * * **/5 * * * * 等这些字符串都属于 Cron 表达式。Node.js 中也支持使用 cron 包来指定定时任务。

既然使用那么广泛,那么它是如何定义的呢?接下来我们就来学习。

语法

经典的 Cron 表达式由 5 位构成,中间用空格分割。语法如下:

sql 复制代码
[minute] [hour] [day of month] [month] [day of week]

每个字段的含义是:

  • [minte] 表示分钟。取值范围 0 到 59
  • [hour] 表示小时。取值范围 0 到 23
  • [day of month] 表示几号。取值范围 1 到 23
  • [month] 表示几月。取值范围 1 到 12,也可以是用名称简写(从 JanDec
  • [day of week] 表示周几。取值范围 0 到 6,也可以是用名称简写(从 SunSat

通用模式

每个位置上除了上面列举的值,还有一些通用模式可以使用:

  • 逗号 ,:表示当前使用的值的列表。比如 [minte] 取值 1,3,5 时,表示1分、3分和5分时各执行一次
  • 连字符号 -:表示当前使用的值的范围。比如 [minte] 取值 1-5 时,等同于 1,2,3,4,5,表示1分、2分、3分、4分和5分时各执行一次
  • 星号 *:表示"从头到尾(frist-last)"。比如 [minte] 取值 * 时,等同于 0-59,表示每分钟执行一次
  • 斜杠符号 /:表示步进。比如 [minte] 取值 */2,表示每 2 分钟执行一次,即在2分、4分......58分、0分(下一个小时)分别执行一次;当 [minte] 取值 1-9/2 时,等同于 1,3,5,7,9,表示1分、5分、5分、7分和9分时各执行一次。步进默认为 1,即 * 的写法等同于 */1,表示每分钟执行一次。

练习

* * * * *

表示每分钟执行一次。等同于 */1 * * * *0-59/1 * * * *

*/30 * * * *

表示每半个小时执行一次。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-03 16:00:00
  • then at 2023-08-03 16:30:00
  • then at 2023-08-03 17:00:00
  • then at 2023-08-03 17:30:00
  • then at 2023-08-03 18:00:00
  • ......

0 * * * *

表示每小时(整点)执行一次。等同于 0 */1 * * *

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-03 16:00:00
  • then at 2023-08-03 17:00:00
  • then at 2023-08-03 18:00:00
  • then at 2023-08-03 19:00:00
  • then at 2023-08-03 20:00:00
  • ......

0 9-17 * * *

从早上9点到下午5点,每小时(整点)执行一次。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-03 16:00:00
  • then at 2023-08-03 17:00:00
  • then at 2023-08-04 09:00:00
  • then at 2023-08-04 10:00:00
  • then at 2023-08-04 11:00:00
  • ......

0 0 * * *

表示每天(整点)执行一次。等同于 0 0 */1 * *

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-04 00:00:00
  • then at 2023-08-05 00:00:00
  • then at 2023-08-06 00:00:00
  • then at 2023-08-07 00:00:00
  • then at 2023-08-08 00:00:00
  • ......

0 8 * * *

表示每天上午 8 点执行一次。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-04 08:00:00
  • then at 2023-08-05 08:00:00
  • then at 2023-08-06 08:00:00
  • then at 2023-08-07 08:00:00
  • then at 2023-08-08 08:00:00
  • ......

0 8 * * 5

表示每周五上午 8 点执行一次。等同于 0 0 * * FRI,相当于是 1 周执行 1 次。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-08-04 00:00:00
  • then at 2023-08-11 00:00:00
  • then at 2023-08-18 00:00:00
  • then at 2023-08-25 00:00:00
  • then at 2023-09-01 00:00:00
  • ......

0 8 * * 4,5 则表示每周四、每周五早上 8 点执行一次。

0 0 * * 1-5

表示每个工作日 8 点执行一次。

0 8 * * 6,0 则表示周末两天早 8 点执行一次。

0 0 1 * *

表示每月 1 号执行一次。等同于 0 0 1 */1 *

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-09-01 00:00:00
  • then at 2023-10-01 00:00:00
  • then at 2023-11-01 00:00:00
  • then at 2023-12-01 00:00:00
  • then at 2024-01-01 00:00:00
  • ......

0 0 1 */3 *

表示每个季度执行一次。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2023-10-01 00:00:00
  • then at 2024-01-01 00:00:00
  • then at 2024-04-01 00:00:00
  • then at 2024-07-01 00:00:00
  • then at 2024-10-01 00:00:00
  • ......

0 0 1 1 *

表示每年执行一次(1月1号 00:00)。

如果当前是 2023-08-03 15:41。那么后续执行时间分别是:

  • next at 2024-01-01 00:00:00
  • then at 2025-01-01 00:00:00
  • then at 2026-01-01 00:00:00
  • then at 2027-01-01 00:00:00
  • then at 2028-01-01 00:00:00
  • ......

掌握以上所列举的这些表达式就足够以后使用的了。

Node.js 中使用

Node.js 可以使用 cron 包执行定时任务。需要注意的是,cron 采用的是 6 位 Cron 表达式语法。

css 复制代码
[seconds] [minute] [hour] [day of month] [month] [day of week]

跟经典语法相比:

  1. 第一位表示"秒",而不是经典定义中的"分钟"
  2. 另外,cron 包目前的 v2 版本的 [month] 的取值范围是 0~11,而非 1~12。不过官方文档说,cron v3 版本开始 [month] 的取值范围将调整为 1~12。

下面就来安装依赖。

bash 复制代码
$ npm install cron 

使用方式如下:

js 复制代码
var CronJob = require('cron').CronJob;
var job = new CronJob(
    '* * * * * *',
    function() {
        console.log('You will see this message every second');
    },
    null,
    true,
    'America/Los_Angeles'
);
// job.start() - See note below when to use this

总结

Cron 是一种用于设置定期执行任务的表达式,语法比较简单,常用于备份系统或清理日志,现在已被广泛地应用于各种操作系统和应用程序中。

经典的 Cron 表达式由 5 位构成,中间用空格分割,分表表示"分钟"、"小时"、"几号"、"几月" 和 "周几"。实际使用时,不同软件可能会做一些拓展,比如 Node.js 的 Cron 使用的就是 6 位,稍稍注意一下即可。

参考链接

相关推荐
爱勇宝8 小时前
人到了一定年纪,才会看懂这些人性真相
前端·后端
梓䈑8 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
程序员黑豆9 小时前
鸿蒙应用开发 @BuilderParam 使用教程:实现灵活的 UI 插槽
前端·harmonyos
万少9 小时前
用 TraeWork 给小孩做一个家庭工作台
前端·人工智能·后端
孙启超9 小时前
【AI应用开发】ReAct 原理是什么?和普通直接提问 LLM 差别在哪?
前端·人工智能·llm·agent·react·rag·ai应用开发
SynthWriter9 小时前
下班前接到急活?我用 TRAE Work 20 分钟搞定了一套完整页面原型
前端
minimoon_jojo9 小时前
Antd Table虚拟滚动详解
前端
颜进强9 小时前
Calude Code - 23 用 MCP 把 Jenkins 变成 AI 队友:一次对话完成自动化发布
前端·后端
wangjialelele9 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
J船长10 小时前
Spec Kit 入门:AI Agent 时代的规格驱动开发实践
前端