Cron 表达式解释器
用通俗语言解读 cron 表达式,查看任意时区的下几次运行时间,并整理成标准格式。
代码示例
可直接复制到你自己的项目中。每个示例只使用该语言的标准库,因此无需安装任何东西。
const expand = (field, min, max) =>
field.split(',').flatMap((part) => {
const [range, step = '1'] = part.split('/')
const [from, to = from] = range === '*' ? [min, max] : range.split('-').map(Number)
return Array.from({ length: Math.floor((to - from) / Number(step)) + 1 }, (_, i) => from + i * Number(step))
})
function matches(expression, instant) {
const [minute, hour, dayOfMonth, month, dayOfWeek] = expression.split(' ')
const inMonth = expand(dayOfMonth, 1, 31).includes(instant.getUTCDate())
const inWeek = expand(dayOfWeek, 0, 7).some((day) => day % 7 === instant.getUTCDay())
const dayMatches =
!dayOfMonth.startsWith('*') && !dayOfWeek.startsWith('*') ? inMonth || inWeek : inMonth && inWeek
return (
expand(minute, 0, 59).includes(instant.getUTCMinutes()) &&
expand(hour, 0, 23).includes(instant.getUTCHours()) &&
expand(month, 1, 12).includes(instant.getUTCMonth() + 1) &&
dayMatches
)
}
console.log(matches('*/15 9-17 * * 1-5', new Date('2023-11-14T09:30:00Z')))它能做什么
用通俗语言解读 cron 表达式,查看它在任意时区的下几次运行时间,并把它整理成标准格式。它支持标准的五字段 cron,也支持带秒的 Quartz 或 Spring 方言。一切都在你的浏览器中完成。
如何使用
- 输入或粘贴一个表达式,例如
*/15 9-17 * * MON-FRI。@daily和@hourly这样的简写也能识别。光标所在的字段会高亮,并在下方解释。 - 选择方言:标准(5 个字段),或 Quartz / Spring(六或七个字段,以秒开头)。
- 选择用来解读计划的时区,以及要列出多少次接下来的运行。
- 在输入框上方用文字阅读描述,下方是接下来的运行时间。并非所有 cron 都认识的写法会以提示指出。
- 点击随机或某个计划标签作为起点,或切换到多行,逐行检查表达式。
示例
@daily → 0 0 * * *
*/15 9-17 * * MON-FRI → 每 15 分钟一次,上午 09:00 至下午 05:59,周一至周五
一个 Quartz 表达式,表示每个月第二个星期一的中午 12 点:
0 0 12 ? * MON#2
须知
- 五个字段依次是分钟、小时、日期、月份和星期。
- 标准 cron 把星期日算作 0。Quartz 和 Spring 把它算作 1,并且要求日期或星期字段中有一个写成
?。 - Cron 按它所在的机器或调度器的时钟运行,所以请选择那个时区,通常是 UTC。
- 支持 Quartz 的
L、W和#(最后一天、最近的工作日、第 n 个星期几)。 - 无法读取的字段会变红,提示信息会指出是哪一个。
- 同时指定几号和星期几时,只要其中一个匹配,任务就会运行,而不是两者都匹配才运行。
@reboot没有可列出的计划,标准 cron 中用7表示星期日,或使用 Quartz 字符?、L、W、#,都会被提示。
什么是 cron 表达式?
Cron 表达式用五个字段说明任务何时运行:分钟、小时、几号、月份和星期几。* 表示每个值,*/15 表示每 15 个,1-5 表示范围,1,15 表示列表。Quartz 和 Spring 会在前面加一个秒字段,有时在末尾加年份,并支持 L、W、# 等扩展。
常见问题
运行时间用的是哪个时区?
你选择的那个。Cron 按它所在机器或调度器的时钟运行,所以请选择那个时区(通常是 UTC)来查看真实运行时间。
标准和 Quartz 有什么区别?
标准 cron 有五个字段,星期天记为 0。Quartz 和 Spring 有六或七个字段,以秒开头,星期天记为 1,并且“日”或“星期”字段中必须有一个是 ?。
这个工具会把我的表达式发送到别处吗?
不会。说明和运行时间都在你的浏览器中计算。你输入的内容不会发送到我们的服务器。