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 都是周日)
│ │ │ │ │
* * * * *

也有系统用别的格式:Spring 和 Quartz 在最前面加秒字段(Quartz 还可在末尾加可选的年份),AWS EventBridge 在末尾加年份字段。ZeroTool 的解析器只支持标准五字段格式,不支持 L、#、?。

特殊字符速查

字符含义示例
*所有值 / 每个单位* * * * * — 每分钟
,列举多个值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

指定时区(cronie,即 Fedora / RHEL 系的 cron,读取 CRON_TZ 作为调度时区;TZ 只改变任务看到的环境变量;其他实现可能不支持 CRON_TZ,以 man 5 crontab 为准):

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

GitHub Actions

POSIX 五字段语法。不设可选的 timezone 键时按 UTC 执行,最短间隔 5 分钟;整点等高负载时段可能延迟,甚至被丢弃(GitHub 文档):

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

北京时间(UTC+8,无夏令时)早 9 点对应 UTC 1:00。

Kubernetes CronJob

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

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

AWS EventBridge

AWS 使用六字段格式,依次是分、时、日、月、星期、年,? 必须出现在日或星期几字段之一(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/syslog 或 journalctl -u cron

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

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

时区搞错了? 国内服务器经常是 UTC,任务时间要换算。cronie 可以在 crontab 顶部设置 CRON_TZ=Asia/Shanghai;不支持 CRON_TZ 的实现只能按系统时区换算,或者在脚本里加时区判断。


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