OneKitTools logoOneKitTools
developer2 分钟阅读

"Cron表达式详解:从基础到高级定时任务"

什么是Cron表达式?学习语法、字段和特殊字符——附实际示例,涵盖"每天午夜"或"每周一上午9点"等常见计划任务。

OneKitTools Team2026年4月14日

什么是Cron表达式?

Cron是Unix/Linux系统内置的基于时间的任务调度器。Cron表达式是告诉cron何时运行任务的语法。

你一定见过:0 0 * * *。它的意思是"每天午夜"。但一旦超出基础范围,cron语法就变得复杂——5个字段、可选的秒、平台差异,以及大多数人不理解就复制粘贴的特殊字符。

本指南让这一切变得清晰。

5个(或6个)字段

标准cron使用5个用空格分隔的字段:

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

某些系统(AWS EventBridge、Spring、Quartz)在开头添加字段,变成6个字段。请检查你的平台。

特殊字符

字符含义示例
*所有值* * * * * = 每分钟
,多个值0 9,17 * * * = 上午9点和下午5点
-范围0 9-17 * * * = 每天9点到17点每小时
/步长*/15 * * * * = 每15分钟
L最后0 0 L * * = 每月最后一天(仅Quartz)
?不指定0 0 ? * MON = 每周一,任意日期(Quartz)

常用Cron表达式

每分钟

* * * * *

每5分钟

*/5 * * * *

每小时整点

0 * * * *

每天午夜

0 0 * * *

每天上午9点

0 9 * * *

每周一上午9点

0 9 * * 1

每个工作日(周一到周五)上午8点

0 8 * * 1-5

每个周末中午

0 12 * * 0,6

每月第一天午夜

0 0 1 * *

每季度(1、4、7、10月)午夜

0 0 1 1,4,7,10 *

工作日9点到17点每30分钟

*/30 9-17 * * 1-5

常见陷阱

"每2小时"是 0 */2 * * *,不是 */2 * * * *

*/2 * * * * 意思是每2分钟。步长作用于它所在的字段。

周日是0也是7

在标准cron中,07都表示周日。避免歧义——统一使用0

月份中的天 与 星期几 是OR关系,不是AND

0 0 1 * 1 会在每月1号以及每个周一执行——不仅仅是落在1号的周一。如果你想要"每月第一个周一",需要在cron外部实现脚本逻辑。

时区

除非另行配置,cron在服务器的本地时区运行。UTC服务器上0 9 * * *的任务在UTC上午9点运行——在你的时区可能是凌晨2点或晚上11点。

始终检查:

timedatectl   # 显示Linux上的当前时区

命名快捷方式(非标准但广泛支持)

快捷方式等价含义
@yearly0 0 1 1 *每年一次
@monthly0 0 1 * *每月一次
@weekly0 0 * * 0每周一次(周日)
@daily0 0 * * *每天一次(午夜)
@hourly0 * * * *每小时一次
@reboot系统启动时

生成和验证Cron表达式

Cron生成器支持可视化构建表达式——用中文描述计划,获取cron表达式。不再需要猜测0 9 * * 1-5是否正确。

反向也支持:粘贴任意cron表达式,获取该表达式何时运行的简明解释。

快速参考卡

# ┌──── 分钟 0-59 # │ ┌─── 小时 0-23 # │ │ ┌── 日 1-31 # │ │ │ ┌─ 月 1-12 # │ │ │ │ ┌ 星期 0-7 (0=周日) # │ │ │ │ │ * * * * * 每分钟 0 * * * * 每小时 0 0 * * * 每天午夜 0 9 * * 1 每周一上午9点 */15 * * * * 每15分钟 0 0 1 * * 每月第一天
分享