MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

cron 表达式解析器

逐个字段解读 cron 表达式,用一句话说明它的含义,并查看它接下来的运行时间。

通俗解释

表达式各字段的含义
字段值含义允许的值
分钟 0–59
小时 0–23
日期 1–31
月份 1–12, JAN–DEC
星期 0–7, SUN–SAT

接下来的运行时间

序号距现在

在浏览器中运行。粘贴的内容不会被上传。

关于此工具

五个字段

cron 表达式由五个以空格分隔的字段组成:分钟(0–59)、小时(0–23)、日期(1–31)、月份(1–12)和星期(0–7,0 和 7 都表示星期日)。cron 每分钟检查一次时钟,当分钟、小时、月份和日期都匹配时就运行任务。日期和星期两个字段按下文所述的规则共同决定某一天是否匹配。

在每个字段中,* 匹配所有值,1,15 这样的列表匹配其中的每个值,1-5 这样的范围匹配从第一个值到最后一个值的全部值,*/15 或 8-18/2 这样的步长则在范围内每隔 N 个取一个值。月份和星期可以写成三个字母的英文名称,即 JAN 到 DEC 和 SUN 到 SAT。

宏是简写形式:@hourly 等于 0 * * * *,@daily 和 @midnight 等于 0 0 * * *,@weekly 等于 0 0 * * 0,@monthly 等于 0 0 1 * *,@yearly 和 @annually 等于 0 0 1 1 *。

日期和星期字段都设置时

日期和星期两个字段不会互相缩小范围。两者都有限制时,只要某天符合其中任意一个,任务就会运行。所以 0 0 13 * 5 会在每月 13 日的午夜运行,也会在每个星期五运行,而不只是在 13 号星期五运行。

Vixie cron 和 cronie 通过第一个字符来判断这两个字段是否有限制。以 * 开头的字段(包括 */2 这样的步长)视为没有限制,这时两个字段都必须匹配。0 0 */2 * 1 会在恰逢每月奇数日的星期一运行。这个工具遵循同样的规则,并会告诉你属于哪种情况。

步长、时区和不解析的内容

步长从范围的起点开始计数,到范围结束时重新开始。分钟字段中的 */15 得到 0、15、30 和 45,确实是每 15 分钟一次。*/7 得到 0、7、14,一直到 56,然后四分钟后又回到 0。表格会列出步长展开后的值,方便你看清这一点。

cron 用运行它的机器的时钟来比对表达式,而很多服务器的时钟设置为 UTC。在接下来的运行时间列表上方选择本地时间或 UTC 来对应那台机器,再看另一列就能知道同一时刻在另一个时区是几点。当本地时钟因夏令时调整时,不同的 cron 实现对设在被跳过或重复那一小时内的任务处理方式不同。这个工具不会列出落在被跳过时间的运行,只有当分钟字段或小时字段以 * 开头时,才会把重复的时间列出两次。

这里只解析标准的五字段语法。秒字段、年字段以及 ?、L、W 和 # 这些字符属于 Quartz 等其他调度器,会被报告为错误。在单个值后面加步长(如 5/15)也会报错:crontab 手册只定义了写在 * 或范围后面的步长,所以应写成 5-59/15。

常见问题

cron 表达式中的 */5 是什么意思?

它表示从该字段允许的最小值开始,每隔五个取一个值。在分钟字段中就是第 0、5、10 分钟,一直到第 55 分钟,所以任务每五分钟运行一次。在小时字段中则是 0、5、10、15 和 20 点。

0 0 13 * 5 只在 13 号星期五运行吗?

不是。当日期和星期两个字段都有限制时,只要其中一个匹配,cron 就会运行任务。这个表达式会在每月 13 日运行,也会在每个星期五运行。

星期日是 0 还是 7?

都是。星期字段接受 0 到 7,0 和 7 都表示星期日。星期一是 1,星期六是 6。也可以写成 SUN、MON 等。

cron 使用哪个时区?

cron 使用其所在系统的时钟和时区,除非你的调度器允许为任务单独设置时区。很多服务器和托管调度服务都运行在 UTC 下,所以在假定使用本地时间之前,请先确认一下。

时间分类的其他工具