为什么「0 0 1 * 1」不是每月 1 号且是周一?
这是 cron 的历史语义:当日和周两个字段都被限定时(都不是 *),满足任意一个就会执行,即「或」的关系。因此 0 0 1 * 1 表示每月 1 号或每周一。要表达「每月 1 号且是周一」,需要在脚本里再判断一次日期。
解析表达式、中文说明与接下来 8 次运行时间
含义09:00 · 周一、周二、周三、周四、周五
| 字段 | 写法 | 取值数 | 展开 |
|---|---|---|---|
| 分 | 0 | 1 | 0 |
| 时 | 9 | 1 | 9 |
| 日 | * | 全部 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 … |
| 月 | * | 全部 | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 |
| 周 | 1-5 | 5 | 1, 2, 3, 4, 5 |
正在计算…
注意标准 cron 的语义:日 与 周 同时被限定时是「或」的关系(例如 0 0 1 * 1 表示每月 1 号或每周一)。 本工具按此语义计算。
Cron 表达式由五个字段组成——分、时、日、月、周,部分实现还支持第六个「秒」字段。每个字段都可用 *、单值、范围(1-5)、步长(*/10)与列表(1,3,5)组合,还支持 JAN-MAR、MON 这样的名称。看似简单,但「日」与「周」同时被限定时是「或」的关系,这一点经常被写错。
本工具会展开每个字段实际匹配的取值,给出中文含义,并计算接下来 8 次运行时间(含相对时间提示)。支持 @daily、@hourly 等常用宏,并内置备份、监控、月报等常见场景的表达式可以直接套用。
这是 cron 的历史语义:当日和周两个字段都被限定时(都不是 *),满足任意一个就会执行,即「或」的关系。因此 0 0 1 * 1 表示每月 1 号或每周一。要表达「每月 1 号且是周一」,需要在脚本里再判断一次日期。
标准 crontab 是 5 段(分 时 日 月 周),最小精度为分钟。部分调度器(如 Quartz、部分云厂商)支持 6 段,第一位是秒,最小精度为秒。本工具两种都支持,会按段数自动判断。
先确认时区:cron 按服务器本地时区执行,而本工具按你浏览器的本地时区计算。如果服务器使用 UTC 而你在东八区,同一表达式会相差 8 小时。另外注意 */5 表示「从 0 开始每 5 分钟」,而不是「从当前时间起每 5 分钟」。