免费工具 Cron 表达式生成器:在线解析与执行时间
Cron 表达式只有一行,却最容易写错。输入一个表达式,或者从常用写法开始改,工具会用中文说明它的意思、逐段拆开,并按服务器实际所在的时区列出接下来几次执行时间——上线之前先看一眼。
- 5 段 / 6 段都支持
- 按任意时区算执行时间
- 本地计算
生成或检查一个 Cron 表达式
点一个常用按钮,或者直接输入表达式。中文说明、逐段拆解和下次执行时间都会边输边更新。
5 段:分 时 日 月 周(Linux crontab)。6 段:最前面多一个秒(Spring、Quartz)。也支持 @daily 这类简写。
下次执行时间按这个时区计算(含夏令时)。选服务器或调度平台实际使用的时区。
中文说明
每周一至周五 09:30
2026-11-13 09:30:00 周五
2026-11-16 09:30:00 周一
2026-11-17 09:30:00 周二
2026-11-18 09:30:00 周三
2026-11-19 09:30:00 周四按所选时区显示,带星期。夏令时跳过的时刻不会列出。
分 30 30
时 9 9
日 * *
月 * *
周 1-5 1,2,3,4,5每一段的原始写法,以及它展开后的具体取值。
分享这组输入:数值写在链接的 # 后面,不会发到服务器。
https://tapcub.com/zh/tools/cron-expression-generator
版本 v1.0更新于 更新记录
每个结果各看什么
先读中文说明,再对照执行时间。两者有一个和你想的不一样,就是表达式写错了。
中文说明
由各段拼出来的一句话,比如「每周一至周五 09:30」。时间和日期都按调度程序实际匹配的方式写。
下次执行时间
从现在往后的真实日期时间,按所选时区显示。问题多半在这里暴露:以为每天一次结果每分钟一次,或者每月任务在 2 月根本不跑。
逐段拆解
每一段的写法和展开后的取值:*/15 展开成 0、15、30、45,MON-FRI 展开成 1–5。* 表示所有值。
提示
6 段表达式、某段超出范围、用了不支持的语法,都会在结果上方提示,并指出是哪一段。
Cron 按执行它的机器或服务的时区运行。云服务器和 Docker 容器默认 UTC 的情况很常见,写之前先确认。
从想法到一行 crontab
四步,最后一步最常被跳过。
-
1
从常用写法开始
点最接近的按钮,比如「工作日 9:30」,或者粘贴你要检查的表达式。
-
2
改各段
改分钟、小时或日期,中文说明会跟着变,每一处改动的效果都看得见。
-
3
选时区
选服务器或调度平台的时区。UTC 服务器上的 9 点,是北京时间下午 5 点。
-
4
核对执行时间
上线前看一遍接下来的执行时间。不对就在这里改好,再复制到 crontab、宝塔计划任务或代码里。
5 段,从左到右:分 时 日 月 周
Linux crontab 是空格隔开的 5 段;Spring 的 @Scheduled(cron = …) 和 Quartz 在最前面多一个「秒」,共 6 段(Quartz 还可以有第 7 段年份)。每一段可以写具体值、列表、区间或步长。
*所有值 ·,列表(1,15)·-区间(9-17)·/步长(*/15、0/5、10-50/20)?表示「不指定」(Quartz 写法),按*处理- 简写:
@yearly、@monthly、@weekly、@daily、@hourly - 「日」和「周」同时限定时,按 crontab 惯例只要满足其一就执行
- 不支持:
L、W、#,以及第 7 段写具体年份
| 段 | 取值范围 | 例子 |
|---|---|---|
| 秒(仅 6 段) | 0–59 | 0 = 整分 |
| 分 | 0–59 | */5 = 每 5 分钟 |
| 时 | 0–23 | 9-17 = 9:00 到 17:59 |
| 日 | 1–31 | 1,15 = 每月 1 号和 15 号 |
| 月 | 1–12 或 JAN–DEC | JAN,JUL = 1 月和 7 月 |
| 周 | 0–7(0 和 7 都是周日)或 SUN–SAT | 1-5 = 周一到周五 |
常用 Cron 表达式对照
中文说明是工具实际输出的结果。最后两行是两个坑:日和周同时写是「或」,以及 Spring / Quartz 的 6 段写法。
| 表达式 | 中文说明 | 常见用途 |
|---|---|---|
*/5 * * * * | 每 5 分钟 | 健康检查、轮询队列 |
0 * * * * | 每小时的第 0 分钟 | 按小时汇总数据 |
0 2 * * * | 每天 02:00 | 凌晨备份数据库、清理日志 |
30 9 * * 1-5 | 每周一至周五 09:30 | 工作日早上发日报 |
*/15 9-17 * * 1-5 | 每周一至周五 09:00–17:59 之间每 15 分钟 | 上班时间同步订单 |
0 0 1 * 1 | 每月 1 号或每周一 00:00 | 多半写错了:每周一也会跑 |
0 0/5 9-17 * * ? | 每天 09:00–17:59 之间每 5 分钟 | Spring @Scheduled / Quartz,秒在最前 |
只想在「既是 1 号又是周一」那天跑,把其中一段写成 *,另一个条件在任务脚本里判断。
Cron 表达式最容易写错的地方
语法很小,错误几乎都出在调度程序「默认」了什么。
时区不对
很多云服务器、Docker 容器默认 UTC,按北京时间写的 9 点会在下午 5 点执行。先确认服务器时区;宝塔面板等计划任务也按服务器系统时间执行。
分钟段写了 *
* 9 * * * 是 9:00 到 9:59 每分钟一次,共 60 次。只想 9 点整跑一次,写 0 9 * * *。
日和周同时限定
0 0 13 * 5 是每月 13 号和每个周五都跑,不是「13 号恰逢周五」。只限定其中一段,另一段写 *。
crontab 和 Quartz 混用
6 段的 Quartz 表达式贴进 crontab 会报错,反过来每段都错位一格。Quartz 的星期从 1 = 周日开始,用 MON 这样的缩写最不容易错。
有些定时任务,其实不用写
不少 Cron 任务只是为了每周一发一份 Excel 报表,或者半夜检查某个数有没有掉。TapCub 在看板里就能做这两件事;后台任务跑完也能把结果当事件上报。
Cron 表达式是什么?
一行用空格隔开的定时规则:分、时、日、月、周。Linux 的 cron 服务从 crontab 文件里读它;Kubernetes CronJob、GitHub Actions、Spring、Quartz 等调度工具也用同样的写法。
Cron 表达式 5 段和 6 段有什么区别?
Linux crontab 是 5 段,最小单位是分钟。Spring 和 Quartz 在最前面加了「秒」,所以 0 30 9 * * * 是 9:30:00。Quartz 还允许第 7 段写年份,星期从 1 = 周日数起;crontab 和 Spring 用 0 或 7 表示周日。
*/5 是什么意思?
步长:从这一段的最小值开始,每隔 5 个取一次。在分钟段里 */5 就是 0、5、10 … 55 分;10-50/20 是 10、30、50 分。
Cron 用的是哪个时区?
执行它的机器或服务的时区。云服务器、Docker 容器默认 UTC 很常见,比北京时间慢 8 小时。部分 cron 实现支持 CRON_TZ 变量,Kubernetes CronJob 有 timeZone 字段,GitHub Actions 的定时默认按 UTC;云函数的定时触发器也常按 UTC,以平台文档为准。
怎么每 30 秒执行一次?
标准 crontab 最小只到分钟。Spring / Quartz 可以用秒段:*/30 * * * * *。只能用 crontab 时,常见做法是写两行,其中一行命令前加 sleep 30。
日和周同时写了会怎样?
按 crontab 惯例,只要满足其中一个就执行:0 0 1 * 1 会在每月 1 号和每个周一都跑。Quartz 要求其中一段写 ?,就是为了避免这种歧义。
支持 L、W、# 吗?
不支持。Quartz 的这几个扩展(月末最后一天、最近的工作日、第几个星期几)会提示不支持;第 7 段写具体年份、以及 @reboot(它不是时间)也不支持。