Cron 有多个版本,最常用的版本是 1987 年由 Paul Vixie 定义的 Vixie Cron,五位,没有秒。
在 Unix 系统的 /etc
文件夹,有 Cron.hourly、Cron.daily、Cron.weekly、Cron.monthly 等预设文件夹,把某个 script 放在其中的一个文件夹,这个 script 就会按照这个文件夹的 Cron 执行任务。
Vixie Cron 没有秒,有些 Cron 版本支持秒。Cron 表达式有 5 位、6 位、7 位三种:
没有提供秒,则认为是第 0 秒;没有提供年,则认为是每一年。
腾讯云函数的定时触发器支持 7 位、5 位表达式,但建议使用 7 位;阿里云函数的定时触发器是 6 位;华为云函数也是 6 位。
* * * * * * *
┬ ┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ | └ year (optional)
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, optional, if omitted, default to 0)
在标准的 cron 语法中,如果 day of month 和 day of week 都不是 *
,那 day of month 和 day of week 是逻辑 OR 的关系,即如果一个日期满足了 day of month 或者 day of week 就被视作符合这个 cron 表达式。
day of month 如果写作 1/5
这种格式,那 /
前后的数字都不能大于 31,即 cron 无法表达每隔 32 天或 40 天这种重复性时间。
cron-parser 是一个可以根据传入的 cron 表达式获取下一个和上一个日期的库。
croner 可以通过 legacyMode
选项,让 day of month 和 day of week 变成逻辑 AND 的关系。