Cron 表达式解析与生成
解读 Unix、Spring、Quartz 和 AWS 的 cron 表达式,查看任意时区的下次运行时间,或逐个字段构建表达式。
计划
字段解析
| 字段 | 表达式 | 值 |
|---|
下次运行时间
可视化生成器
为每个字段选择重复方式。“指定值”填写列表,如 1,15 或 MON,WED;“范围”填写起止,如 9-17;“每 N”填写步长。
特殊字符
| * | 字段的所有值。 |
| , | 值列表,例如 1,15,30。 |
| - | 范围,例如 9-17 或 MON-FRI。 |
| / | 步长,例如 */15 = 每 15;5/15 = 从 5 开始每 15(Unix cron 不支持)。 |
| ? | 不指定值。Quartz 和 AWS 要求在日或星期字段中使用。 |
| L | 最后:日字段中的 L = 最后一天,L-3 = 最后一天的前 3 天;星期字段中的 5L = 最后一个星期四(Quartz 编号)。 |
| W | 最近的工作日:15W = 最接近 15 日的工作日;LW = 当月最后一个工作日。 |
| # | 当月第 N 个星期几:Quartz/AWS 中 6#3 = 第三个星期五(1 = 星期日);Spring 中为 5#3(0 = 星期日)。 |
| @daily … | 宏:@yearly、@monthly、@weekly、@daily、@hourly;@reboot 在启动时运行一次。 |
使用方法
- 在“Cron 表达式”中输入或粘贴计划,或者点击某个示例(这也会将“格式”设为“自动检测”)。摘要和运行时间会随输入更新。
- 将“格式”保持为“自动检测”,或选择该表达式所针对的系统。自动检测会将 5 个字段视为 Unix,7 个字段视为 Quartz。对于 6 个字段,它会根据 "?" 的位置选择 AWS 或 Quartz;如果最后一个字段包含 1970 到 2199 之间的年份,则选择 AWS;否则视为 Spring。@weekly 等宏按 Unix 读取。表达式有效时,状态行会显示所使用的格式。
- 查看“计划”和“字段解析”,了解每个字段匹配的内容,然后检查“下次运行时间”中的日期。“时区”最初为浏览器的时区,需要时可以选择其他时区,并在“显示的运行次数”中选择 5、10 或 20。所选时区不是 UTC 时,每次运行还会同时显示 UTC 时间。
- 如果想自行构建表达式,请打开“可视化生成器”,选择格式,并为每个字段选择重复方式,在字段需要时填写值。“使用此表达式”会将“生成的表达式”复制到“Cron 表达式”中,把“格式”设为生成器所用的格式并进行解析,方便您检查运行时间。
常见问题
我输入的表达式会被发送到其他地方吗?
不会。表达式的解析和运行时间的计算都通过 JavaScript 在您的浏览器中进行,表达式不会上传到 LeedyBox。
为什么 0 0 13 * 5 每个星期五都会运行,而不只是在 13 日恰逢星期五时运行?
在 Unix cron 中,如果日和星期两个字段都有限制(都不以 * 开头),只要其中任一字段匹配,这一天就算匹配,因此该表达式会在每月 13 日和每个星期五运行。本工具对 Unix 表达式采用此规则,此时“计划”中会显示“满足其一即可”。对于 Spring 表达式,工具要求两个字段同时匹配;Quartz 和 AWS 则要求两个字段之一必须为 "?",从而避开了这个问题。在 Unix cron 中,常见的变通方法是将任务安排在每个星期五运行,再在任务内部检查日期。
星期日是 0、1 还是 7?
这取决于格式。在 Unix 和 Spring 表达式中,0 和 7 都表示星期日,1 表示星期一;在 Quartz 和 AWS 中,1 表示星期日,7 表示星期六,因此 1-5 在这两种格式中表示星期日到星期四。在 Spring、Quartz 和 AWS 中使用 MON-FRI 这样的星期名称,可以避免这种差异。
为什么我的 crontab 行或 AWS cron( ) 表达式被判为无效?
请只输入计划字段。crontab 行末尾的命令以及 /etc/crontab 中的用户名都会被算作多余的字段,因此工具会报告字段无效或字段数量不对。对于 AWS,请只粘贴 cron( ) 括号内的六个字段,不要带外层的 cron( )。
如何将 Unix 表达式改写为 Spring、Quartz 或 AWS 格式?
Spring 在开头增加了秒字段,因此 0 9 * * 1-5 会变成 0 0 9 * * 1-5。Quartz 还要求日和星期字段之一为 "?",并将星期日编号为 1,因此同样的计划写作 0 0 9 ? * MON-FRI。AWS 没有秒字段,但和 Quartz 一样要求日和星期字段之一为 "?",并在末尾增加了年份:0 9 ? * MON-FRI *。如果 Unix 表达式同时限制了日和星期两个字段,它依赖的是上文所述的“满足其一即可”规则,而这些格式不采用该规则,因此通常需要拆成两个计划。请选择目标格式检查结果,并对比下次运行时间。
为什么工具提示没有找到运行时间?
表达式有效,但在工具搜索的未来约 8 年内没有找到匹配的时间。常见原因包括日期不存在,例如 0 0 30 2 *(2 月 30 日),或 31 日只与 30 天的月份组合;以及年份字段已经过去。年份在 8 年之后时也会显示同样的提示,尽管该计划以后仍可能运行。包括传统 Unix cron 在内的一些调度器会不加警告地接受不存在的日期,而任务则不会运行。
使用哪个时区?夏令时如何处理?
运行时间按“时区”中所选的时区计算。请选择调度器实际使用的时区:crontab 通常遵循服务器的时区,AWS EventBridge 的计划规则使用 UTC,而 EventBridge Scheduler 允许设置时区。菜单中提供浏览器所在的时区、UTC 以及部分常用时区;如果其中没有调度器所用的时区,请选择一个 UTC 偏移量和夏令时起止日期都相同的时区。时钟拨快时被跳过的时间点上的运行不会出现在列表中,时钟回拨时出现两次的时间只列出一次。不同的 cron 守护进程对这些时段的处理方式不同,例如 cronie 可能会在时钟调整后立即运行原定在被跳过时段内的任务。请确认您所用调度器的行为,或者改用没有夏令时的 UTC。