Cron 表达式控制着几乎所有定时任务的执行时机——Linux crontab、GitHub Actions 的 schedule、Kubernetes CronJob、AWS EventBridge 都用这套语法。五个字段挤在一起,0 9 * * 1-5 不对照参考资料很难直接读懂。在线解析器把表达式翻译成人话,还能即时验证写法是否正确。

在线解析 Cron 表达式 →

Cron 表达式结构

标准的 cron 表达式由五个字段组成,用空格分隔:

┌───────── 分钟 (0–59)
│ ┌───────── 小时 (0–23)
│ │ ┌───────── 日 (1–31)
│ │ │ ┌───────── 月 (1–12)
│ │ │ │ ┌───────── 星期几 (0–7,0 和 7 都是周日)
│ │ │ │ │
* * * * *

Quartz、Spring、AWS Lambda 等系统使用六或七字段格式,在最前面加了秒字段(0–59),或者在最后加了年份字段。解析器支持两种变体。

特殊字符速查

字符含义示例
*所有值 / 每个单位* * * * * — 每分钟
,列举多个值1,15 * * * * — 第 1 分钟和第 15 分钟
-范围1-5 * * * * — 第 1 到第 5 分钟
/步长*/15 * * * * — 每 15 分钟
L最后0 0 L * * — 每月最后一天(非标准)
#第 N 个星期几0 10 * * 1#2 — 每月第二个周一
?无特定值Quartz 格式中用于日或星期几字段

20 个常用 Cron 表达式

每 N 分钟

# 每分钟
* * * * *

# 每 5 分钟
*/5 * * * *

# 每 15 分钟
*/15 * * * *

# 每 30 分钟
*/30 * * * *

按小时和天

# 每小时整点
0 * * * *

# 每天零点(UTC)
0 0 * * *

# 每天早上 9 点(UTC)
0 9 * * *

# 每天早 8 点和晚 8 点各一次
0 8,20 * * *

按工作日

# 每个工作日早 9 点
0 9 * * 1-5

# 每周一早 9 点
0 9 * * 1

# 周一、三、五中午
0 12 * * 1,3,5

# 周末早 10 点
0 10 * * 0,6

按月、季度

# 每月 1 号零点
0 0 1 * *

# 每月 1 号和 15 号零点
0 0 1,15 * *

# 每季度第一天(1、4、7、10 月)
0 0 1 1,4,7,10 *

其他常见场景

# 元旦零点
0 0 1 1 *

# 每周日凌晨 4 点(维护窗口)
0 4 * * 0

# 每 6 小时
0 */6 * * *

各平台差异

Linux crontab

标准五字段语法,使用系统时区。

# 查看当前 crontab
crontab -l

# 编辑 crontab
crontab -e

指定时区:

TZ=Asia/Shanghai
0 9 * * 1-5 /path/to/script.sh

GitHub Actions

五字段格式,固定 UTC 时区。注意在高负载时实际执行可能延迟几分钟:

on:
  schedule:
    - cron: '0 1 * * *'  # UTC 凌晨 1 点,即北京时间早 9 点

北京时间早 9 点对应 UTC 1:00(非夏令时)。

Kubernetes CronJob

标准五字段,Kubernetes 1.27+ 支持 spec.timeZone

spec:
  schedule: "0 9 * * 1-5"
  timeZone: "Asia/Shanghai"

AWS EventBridge

AWS 使用六字段格式,第一位是秒,? 必须出现在日或星期几字段之一:

cron(0 1 ? * MON-FRI *)   # 每个工作日 UTC 1:00
rate(5 minutes)            # 每 5 分钟(rate 表达式更简单)

快速读懂 Cron 表达式

几个规律记住后,大多数表达式可以直接读出来:

  • 第一个字段是 0 + 第二个字段有值 = “在那个小时的整点”
  • 字段是 * = “每个”
  • */n = “每 n 个单位”
  • a-b = “从 a 到 b 的连续范围”
  • a,b,c = “只在 a、b、c 这几个值上”

所以 0 9 * * 1-5:分钟 0、小时 9、任意日、任意月、周一到周五 → 每个工作日早上 9:00

常见问题排查

任务没有执行? 检查清单:

  1. cron 守护进程是否运行:systemctl status cron
  2. 脚本是否有执行权限:chmod +x script.sh
  3. 脚本内是否使用了绝对路径(cron 的 $PATH 很短)
  4. 是否保存了 crontab:crontab -l 确认
  5. 查看日志:/var/log/syslogjournalctl -u cron

输出丢失? cron 默认把输出发邮件。重定向到日志文件:

0 9 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1

时区搞错了? 国内服务器经常是 UTC,任务时间要换算。最稳的方式是在 crontab 顶部设置 TZ=Asia/Shanghai,或者在脚本里加时区判断。


上线前先验证表达式。立即使用 Cron 表达式解析器 →