Cron 表达式解析器
粘贴像 30 9 * * 1-5 这样的时间表,就能看到它的意思、是否有效,以及在你的时区里下一次什么时候运行。它会解释最容易踩坑的规则,比如日期和星期“满足任一即可”,以及夏令时。不会上传任何内容,全部在浏览器里完成。
五个字段:分钟、小时、日期、月份、星期。也可以直接粘贴整行 crontab,时间表后面的命令会被忽略。
试试这些例子
含义
每周一至周五 09:30
接下来的运行时间
留空表示从现在开始。选一个日期,可以看看时钟调整前后会发生什么。
正在获取当前时间…
逐个字段
| 字段 | 写法 | 含义 | 允许的值 |
|---|---|---|---|
| 分钟 | 30 | 30 | 0-59 |
| 小时 | 9 | 9 | 0-23 |
| 日期 | * | 每月的每一天 | 1-31 |
| 月份 | * | 每个月 | 1-12 或 JAN-DEC |
| 星期 | 1-5 | 周一至周五 | 0-7 或 SUN-SAT(0 和 7 都是周日) |
值得知道的规则
- •日期和星期:如果两个字段都做了限制,满足任意一个就会运行。0 0 13 * 5 会在每月 13 日和每个周五运行,而不只是“13 号恰逢周五”。只要其中一个字段以 * 开头,就要求两者同时满足。
- •时钟调整(Vixie cron 和 cronie):时钟向前跳时,分钟和小时都固定、且落在被跳过时段里的任务,会在跳变后立即运行一次;分钟或小时以 * 开头的任务则直接跳过这些分钟。时钟回拨时,固定时间的任务只运行一次,以 * 开头的任务在重复的那一小时里会运行两遍。
- •其他调度器(systemd 定时器、Kubernetes CronJob、云服务的定时任务、Quartz)对时钟调整和日期字段的处理可能不同,边界情况请查阅对应文档。
它是怎么算的
- •按传统 cron(Vixie cron 和 cronie,大多数 Linux 系统和 macOS 使用)的规则解析:五个字段,支持 JAN、MON 这样的名称,以及范围、列表和步长,0 和 7 都表示周日。@daily 这类简写会被展开。
- •中文说明是根据解析出的字段生成的,而不是从文字上猜,所以 0,15,30,45 和 */15 都会读成“每 15 分钟”。
- •运行时间是在你选择的时区里逐日推算的。时区规则来自浏览器内置的时区数据,时钟调整遵循 cron 自己的规则:被跳过的时间,固定时间的任务会在跳变后运行一次;重复出现的时间,运行一次还是两次取决于分钟或小时字段是否以 * 开头。
- •我们用另一份独立的 Python 参考实现核对了运行时间:它逐分钟模拟 cron 守护进程,覆盖纽约、伦敦、豪勋爵岛、加尔各答和 UTC 的夏令时切换。
常见问题
- 为什么任务在我没想到的日子运行了?
- 如果同时限制了日期和星期,cron 会在任意一个满足时运行。0 0 1 * 1 会在每月 1 日和每个周一运行。如果你想要“1 日恰好是周一时才运行”,单靠 cron 写不出来,常见做法是在命令里再判断一次日期。
- 02:30 的任务遇到时钟调整会怎样?
- 在 Vixie cron 和 cronie 中,如果时钟向前跳导致 02:30 不存在,分钟和小时都固定的任务会在跳变后立即运行一次。如果时钟回拨导致 01:30 出现两次,固定时间的任务只在第一次运行,而分钟或小时字段以 * 开头的任务两次都会运行。其他调度器可能不同,所以工具会把这些运行时间单独标出来。
- 支持带 ?、L、W、# 的 Quartz 或 AWS cron 吗?
- 不支持。这些方言的日期字段规则不同,还有秒字段和可选的年份字段。工具会识别出这些语法并直接告诉你,而不是去猜。它支持在常规五个字段前加一个秒字段,也就是 Spring 和 node-cron 的写法。
- 我的 crontab 会被发到别处吗?
- 不会。解析和运行时间计算都在本页的浏览器里完成。如果你粘贴的是整行 crontab,时间表后面的命令会被忽略,也不会离开本页。