Cron 表达式工具
Cron 表达式是 crontab、Quartz、Spring 和 K8s CronJob 用来描述「什么时候执行」的字段串,形如 0 30 3 * * ?。本工具把它翻成中文含义、逐段拆解,并按所选时区算出接下来 10 次执行时间,也能点选「每周一到周五 9:00」反向生成。5/6/7 段与 @daily 都认,星期编号差异、日与周并集、L/W/# 逐条提示,本地计算不上传。
每天 03:30 执行
按 北京时间 (UTC+8) 计算 · 本次按「Quartz(Java 调度框架)」解释
本页按固定偏移时区计算,不处理夏令时(DST)。真实的 cron 按服务器自己的本地时区执行,夏令时切换当天各实现的行为并不一致。
这是 6 段表达式,既可能是 Quartz / Spring(秒在最前),也可能是 crontab 多写了一段。本次按「秒 分 时 日 月 周」解释,可在上方切换方言。
当前表达式超出可视化生成器的表达范围,已切到「高级」,仅显示解析结果,输入框内容未被改写。
逐段拆解
| 字段 | 原文 | 取值范围 | 这一段的意思 |
|---|---|---|---|
| 秒 | 0 | 0-59 | 0 |
| 分钟 | 30 | 0-59 | 30 |
| 小时 | 3 | 0-23 | 3 |
| 日 | * | 1-31 | 每个值(1-31) |
| 月 | * | 1-12 或 JAN-DEC | 每个值(1-12) |
| 周 | ? | crontab / Spring:0-7(0 和 7 都是周日);Quartz:1-7(1=周日) | 不指定(由另一个字段决定) |
Cron 表达式在线生成器
这个 Cron 表达式生成器同时支持 cron 在线生成与 quartz 表达式在线生成:点选下面的预设即可定时表达式生成, 结果直接写进上面的输入框;切换方言会按该方言重新拼装,crontab 在线改写走的也是同一套。
当前表达式超出可视化范围,直接在上方输入框里改。
表达式在你的浏览器里本地解析与推算,不联网、不上传,你输入的内容不会出现在任何请求里。本地只保存方言、时区、条数、示例库是否展开这几项视图偏好,上面有一键清除。
Cron 表达式是什么,怎么读懂
Cron 表达式是一串用空格隔开的字段,用来回答一个问题:这个定时任务什么时候跑。它是 Linux 定时任务表达式的事实标准, crontab、Quartz、Spring 的 @Scheduled、K8s CronJob 的 schedule 用的都是同一套写法, 差别只在段数与个别字符上。很多人搜 cron 表达式详解,其实只要记住一件事:每一段管一个时间单位,从小到大排。
| 段数 | 字段顺序 | 秒 | 年 |
|---|---|---|---|
| 5 段 | 分钟 小时 日 月 周 | 无秒 | 无年 |
| 6 段 | 秒 分钟 小时 日 月 周 | 有秒 | 无年 |
| 7 段 | 秒 分钟 小时 日 月 周 年 | 有秒 | 有年 |
拿本页默认那条 0 30 3 * * ? 来读:第一段 0 是秒、第二段 30 是分、第三段 3 是时,后面三段依次是日、月、周。日写 * 表示每天,周写 ? 表示不指定, 合起来就是「每天 03:30 执行」。把它贴进上面的输入框,中文含义、逐段拆解和 cron 下次执行时间会同时出来。
怎么解析 Cron 表达式并算下次执行时间
Cron 表达式在线解析这件事,难的从来不是把字符串切开,而是三件容易出错的小事:方言判断、日与周的并集语义、 以及按哪个时区算。本页的做法是——拿不准就明说,不替你拍板:
- 先定方言:5 段按 Linux crontab 解释,6 段默认按「秒在最前」解释并给出歧义提示, 7 段按 Quartz 带年字段解释。判断不对就在上方手动切换,切完立刻重算。
- 再展开每个字段:把通配、列表、范围、步长这四个基础字符(
* , - /), 以及 Quartz 的? L W #,逐个展开成具体值集合。 这一步顺带做 cron 表达式校验,越界、步长为 0、范围反转都会一次列全,而不是只报第一条。 - 最后按字段跳跃搜索:从起算时刻出发,年不对就跳年、月不对就跳月、日不匹配就跳天, 不做逐分钟试探。这样
0 0 29 2 *这种四年一次的表达式也能在毫秒内算出来。
时区只提供固定偏移档位(UTC±N),与 时间戳转换 用的是同一套约定。 想拿一个具体时刻反查它对应的 epoch 秒,把结果里的时间贴过去就行。
换句话说,这一个 cron 表达式解析器同时是三样东西:把符号串读成人话的 cron 表达式转中文工具、 把执行时刻一条条排出来的 cron 表达式计算器,以及在贴进服务器之前先过一遍语法的 cron 表达式在线校验器。 英文检索里它们分别叫 cron expression parser、cron next run time 和 crontab generator,说的都是同一件事。
Cron 表达式字段与特殊字符速查
下面两张表就是 cron 表达式怎么写的全部依据。第一张是每个字段的取值范围,第二张是八个特殊字符的含义—— cron 表达式 l 是什么意思、cron 表达式问号什么意思,答案都在第二张表里。
| 字段 | 取值范围 | 可用特殊字符 | 说明 |
|---|---|---|---|
| 秒 | 0-59 | * , - / | 只有 Quartz 与 Spring 的 6/7 段表达式才有秒字段,且它排在最前面;Linux crontab 没有秒。 |
| 分钟 | 0-59 | * , - / | 5 段表达式里它是第 1 段,6/7 段里是第 2 段;写 */5 表示每 5 分钟。 |
| 小时 | 0-23 | * , - / | 24 小时制,没有 24 这个值;每天凌晨 3 点写 3,不写 03 也不写 3AM。 |
| 日 | 1-31 | * , - / ? L W | 几号执行。它和「周」字段同时限定时取并集,这是最常被写错的一条。 |
| 月 | 1-12 或 JAN-DEC | * , - / | 可以写数字,也可以写 JAN、FEB 这样的三字母英文缩写,大小写不敏感。 |
| 周 | crontab / Spring:0-7(0 和 7 都是周日);Quartz:1-7(1=周日) | * , - / ? L # | 星期几执行。三种方言的编号基准不一样,是本工具提示最多的字段。 |
| 年 | 1970-2099 | * , - / | 只有 Quartz 的 7 段表达式才有年字段,可以省略;crontab 与 Spring 都没有。 |
Cron 表达式特殊字符速查表
| 字符 | 叫法 | 可用字段 | 支持的方言 | 含义 | 例子 |
|---|---|---|---|---|---|
| * | 通配 | 全部字段 | crontab / Quartz / Spring | 该字段的每一个值都命中,也就是「不限制」。 | 0 * * * * 表示每小时的第 0 分钟执行 |
| , | 列表 | 全部字段 | crontab / Quartz / Spring | 把多个值并起来,取并集。 | 0 9,12,18 * * * 表示每天 9 点、12 点、18 点执行 |
| - | 范围 | 全部字段 | crontab / Quartz / Spring | 闭区间,两端都包含;周和月允许回绕写法。 | 0 9 * * 1-5 表示每周一至周五 9 点执行 |
| / | 步长 | 全部字段 | crontab / Quartz / Spring | 从起点开始每隔 n 个单位命中一次,不是「整除」。 | */15 * * * * 表示每 15 分钟执行,命中 0、15、30、45 |
| ? | 不指定 | 日 / 周 | Quartz / Spring | 表示该字段不参与限制,由另一个字段决定;Quartz 要求日和周恰好有一个写成 ?。 | 0 0 9 ? * MON-FRI 表示每周一至周五 9 点执行 |
| L | 最后 | 日 / 周 | Quartz / Spring | 在日字段表示当月最后一天,可写 L-3 表示最后一天前 3 天;在周字段跟在数字后表示当月最后一个星期几。 | 0 0 2 L * ? 表示每月最后一天 2 点执行 |
| W | 最近工作日 | 日 | Quartz(Spring 部分版本支持) | 离指定日期最近的工作日,周末顺延或提前,且不跨月;LW 表示当月最后一个工作日。 | 0 0 2 15W * ? 表示离 15 号最近的工作日 2 点执行 |
| # | 第几个星期几 | 周 | Quartz / Spring | 写成 x#n,表示当月第 n 个星期 x;某些月份没有第 5 个,会自然跳过而不是报错。 | 0 0 2 ? * 6#3 表示每月第 3 个周五 2 点执行 |
@ 快捷写法与等价表达式对照
crontab 还认一组 @ 开头的快捷写法,@daily cron 是其中最常见的一个。本页会把它们展开成等价表达式再照常计算, 只有 @reboot 例外——它表示开机时执行,没有固定时间点,所以本页不会替它编造一个下次执行时间。
| 写法 | 等价表达式 | 含义 |
|---|---|---|
| @yearly | 0 0 1 1 * | 每年 1 月 1 日 00:00 执行 |
| @annually | 0 0 1 1 * | 与 @yearly 完全等价 |
| @monthly | 0 0 1 * * | 每月 1 日 00:00 执行 |
| @weekly | 0 0 * * 0 | 每周日 00:00 执行 |
| @daily | 0 0 * * * | 每天 00:00 执行 |
| @midnight | 0 0 * * * | 与 @daily 完全等价 |
| @hourly | 0 * * * * | 每小时的第 0 分钟执行 |
| @reboot | — | 开机时执行一次,没有固定时间点,K8s CronJob 里无意义 |
5 段、6 段、7 段方言与星期编号对照
这张表是本页最想让你带走的东西。同一串 0 0 12 ? * 1,在 Quartz 里是每周日、在 crontab 里根本不合法; 同一个数字 1,Quartz 说是周日、crontab 说是周一。六位 cron 表达式与七位 cron 表达式的区别、cron 表达式秒放在哪、 cron 星期几对应数字、cron 0 是周几——一张表全部答完。
| 方言 | 段数 | 秒字段 | 年字段 | 星期编号 | 问号 ? | 典型使用场景 |
|---|---|---|---|---|---|---|
| Linux crontab(Vixie cron) | 5 段 | 没有秒字段,最细到分钟 | 没有年字段 | 0-7,0 和 7 都表示周日,1 表示周一 | 不支持 ?,本页遇到会按 * 处理并提示 | crontab -e、K8s CronJob 的 schedule、Jenkins 的定时构建(Jenkins 另有 H 扩展) |
| Quartz(Java 调度框架) | 6 段或 7 段 | 有秒字段,排在最前面 | 第 7 段是年,可省略,取值 1970-2099 | 1-7,1 表示周日、7 表示周六,没有 0 | 要求日和周恰好有一个写成 ? | Quartz Scheduler、XXL-JOB、Elastic-Job 等 Java 生态的调度中心 |
| Spring(@Scheduled) | 6 段 | 有秒字段,排在最前面 | 没有年字段 | 0-7,0 和 7 都表示周日,与 crontab 一致 | 支持 ? 但不强制,日和周可以同时写具体值,按并集执行 | Spring Boot 的 @Scheduled(cron = "...")、Spring 的 CronExpression |
常用 Cron 表达式写法对照表
下面这张表覆盖了绝大多数实际需求:cron 每 5 分钟、cron 每小时执行、cron 每天几点执行、cron 每周一执行、 cron 每月 1 号执行、cron 工作日执行、cron 最后一天,都能在这里直接抄走。含义一列是本页解析器现场生成的, 与上面的计算结果同源,不会出现表里写一套、算出来另一套。
| 表达式 | 方言 | 中文含义 | 典型用途 |
|---|---|---|---|
| * * * * * | 5 段 | 每分钟执行 | 每分钟跑一次的健康检查、心跳上报 |
| */5 * * * * | 5 段 | 每 5 分钟执行 | 高频同步、队列补偿任务 |
| */15 * * * * | 5 段 | 每 15 分钟执行 | 缓存刷新、监控采集 |
| */30 * * * * | 5 段 | 每 30 分钟执行 | 半小时一次的对账轮询 |
| 0 * * * * | 5 段 | 每小时的第 0 分钟执行 | 整点执行的小时级统计 |
| 15 * * * * | 5 段 | 每小时的第 15 分钟执行 | 错开整点、避开高峰的小时任务 |
| 0 */2 * * * | 5 段 | 每 2 小时执行 | 每两小时一次的日志归档 |
| 0 3 * * * | 5 段 | 每天 03:00 执行 | 凌晨 3 点的数据库备份 |
| 30 2 * * * | 5 段 | 每天 02:30 执行 | 每天凌晨 2:30 的全量同步 |
| 0 9,18 * * * | 5 段 | 每天 09:00、18:00 执行 | 早晚各一次的报表推送 |
| 0 9 * * 1-5 | 5 段 | 每周一至周五 09:00 执行 | 工作日早上 9 点的日报提醒 |
| 0 18 * * 5 | 5 段 | 每周五 18:00 执行 | 每周五下班前的周报汇总 |
| 0 0 * * 0 | 5 段 | 每周日 00:00 执行 | 每周日零点的周度清理 |
| 0 9 * * MON | 5 段 | 每周一 09:00 执行 | 用英文缩写写周一,可读性更好 |
| 0 0 1 * * | 5 段 | 每月 1 日 00:00 执行 | 每月 1 号的月度结算 |
| 0 0 1,15 * * | 5 段 | 每月 1 日、15 日 00:00 执行 | 月中月初各一次的分账 |
| 0 0 1 1 * | 5 段 | 每年 1 月的 1 日 00:00 执行 | 每年元旦的年度归档 |
| 0 8-18/2 * * 1-5 | 5 段 | 每周一至周五 08:00、10:00、12:00、14:00、16:00、18:00 执行 | 工作日白天每两小时巡检一次 |
| 0 0 13 * 5 | 5 段 | 每月 13 日或每周五 00:00 执行(日与周取并集,满足其一即执行) | 演示日与周并集:13 号或周五都会执行 |
| 0 0 3 * * ? | 6 段或 7 段 | 每天 03:00 执行 | Quartz 6 段写法,秒在最前面 |
| 0 0/10 * * * ? | 6 段或 7 段 | 每 10 分钟执行 | Quartz 常见的每 10 分钟写法 |
| 0 0 9 ? * MON-FRI | 6 段或 7 段 | 每周一至周五 09:00 执行 | XXL-JOB 里最常见的工作日任务 |
| 0 0 2 L * ? | 6 段或 7 段 | 每月最后一天 02:00 执行 | 每月最后一天的月末结账 |
| 0 0 2 LW * ? | 6 段或 7 段 | 每月最后一个工作日 02:00 执行 | 月末最后一个工作日的财务任务 |
| 0 0 2 15W * ? | 6 段或 7 段 | 每月离 15 号最近的工作日 02:00 执行 | 每月 15 号附近的工作日发薪 |
| 0 0 2 ? * 6#3 | 6 段或 7 段 | 每月第 3 个周五 02:00 执行 | 每月第 3 个周五的例会提醒 |
| 0 0 2 ? * 6L | 6 段或 7 段 | 每月最后一个周五 02:00 执行 | 每月最后一个周五的版本发布 |
| 0 0 0 1 1 ? 2030 | 6 段或 7 段 | 2030 年 1 月的 1 日 00:00 执行 | 带年字段的一次性任务 |
| 0 30 9 * * * | 6 段 | 每天 09:30 执行 | Spring @Scheduled 的 6 段写法 |
| 0 0 9 * * 1-5 | 6 段 | 每周一至周五 09:00 执行 | Spring 的工作日任务,周编号与 crontab 一致 |
想把某一条直接发给同事,用交互区的「复制深链」按钮;想把执行时间列表贴进表格,用「下载 TSV」, 文件带 BOM,Excel 双击打开中文不乱码。要顺手校验一段 YAML 或 JSON 配置,去 JSON 格式化/校验 或 正则测试器。
Cron 表达式最容易踩的几个坑
cron 日和周同时写是「或」还是「且」
0 0 13 * 5 不是「13 号那天如果是周五就执行」,而是「每月 13 号或每个周五都执行」。 Vixie cron 在日和周都被限定时取并集,这是全网被写错最多的一条。想验证不用背规则,把它贴进上面的输入框, 执行时间列表里会同时出现 13 号和周五两种日期。要表达「且」的语义,cron 本身做不到,只能在脚本里再判一次。
Quartz 的 1 是周日,crontab 的 1 是周一
这一条上面已经讲过,这里补一个更隐蔽的分支:Quartz 的周字段没有 0,写 0 直接报错; 而 crontab 和 Spring 里 0 和 7 都表示周日,两种写法等价。本页在你用 Quartz 方言写数字周时会常驻一条提示。
6 段到底是 Quartz 还是 crontab 的写法
光看 6 段是分不出来的:它可能是 Quartz / Spring 的「秒 分 时 日 月 周」,也可能是有人在 crontab 后面 多写了一段。本页默认按秒在最前解释并给出歧义提示,你可以手动切到 Linux crontab 看另一种解释—— 同一串在两个方言下的答案往往完全不同,这正是需要提示而不是闷头选一个的原因。
cron 表达式日字段写 */2 算不算通配
0 0 */2 * 5 里的日字段既像通配又像限定,各家实现处理并不一致,直接影响上面那条并集判定的结果。 本页按 Vixie 的标志位行为处理(首字符是星号就算通配),同时出提示条把这件事摊开讲。要消除歧义, 把它改写成 1-31/2 这样的显式范围,或者干脆去掉周字段。
cron 表达式每 40 分钟执行为什么会漏
*/40 * * * * 并不是每 40 分钟一次。步长是在本字段自己的取值范围里数格子的: 分钟范围 0–59,从 0 起每隔 40 个只数得出 0 和 40 两个值,到了下一小时又从 0 重新数。 把它贴进上面的输入框看执行时间列表就一目了然——00:40、01:00、01:40、02:00 依次排下去, 间隔在 40 分钟和 20 分钟之间来回跳,一天触发 48 次而不是 36 次。 顶上那句中文含义只是按字面概括成「每 40 分钟执行」,真实节奏一律以执行时间列表为准。 小时字段同理:0 */5 * * * 命中 0、5、10、15、20 点,20 点到次日 0 点整整隔了 4 小时。 判断规则一句话:步长能整除字段范围长度(分钟 60、小时 24)才是均匀的, 所以 5、10、15、20、30 分钟都没问题,40、45、50 分钟一定会漏。真要每 40 分钟一次,一条表达式做不到, 得拆成两行写:0,40 */2 * * * 配上 20 1-23/2 * * *。
cron 表达式 2 月 30 号为什么永不执行
0 0 30 2 * 每一段都在取值范围内,所以语法校验通不出错,但它永远不会命中。很多在线工具遇到这种表达式 会静默返回一个空列表,让人以为工具坏了。本页会明写「这条表达式永远不会执行:2 月没有 30 号」。 与之相反的是 0 0 29 2 *,它是合法且会执行的,只是间隔很长—— 而且格里高利历里闰日的最大间隔是 8 年(2096 年之后要等到 2104 年,因为 2100 年不是闰年), 所以任何「只往后找 5 年」的工具都会把它误报成永不执行。本页的搜索窗口定在 12 年,正是为了跨过这个缺口。
cron 表达式时区:服务器说了算,不是浏览器说了算
真实的 cron 按运行它的那台服务器的本地时区执行。本页只提供固定偏移档位、不处理夏令时, 因为夏令时切换当天各实现的行为(跳过还是重复执行)并不一致,猜不如不猜。K8s CronJob 可以用 spec.timeZone 显式指定,crontab 可以在文件里写 CRON_TZ=,本页识别到这个前缀会提示你, 但仍按上方所选时区计算。要在多个时区之间排时间,去 跨时区会议助手。
K8s CronJob 的 schedule 和 crontab 有细微差别
k8s cronjob schedule 用的是标准 5 段语法,也支持 @ 快捷写法,但 @reboot 在集群里没有意义, 而且没有秒字段——想要秒级只能换别的方案。另外 K8s 有 startingDeadlineSeconds 与并发策略, 错过的任务补不补跑由它们决定,不是 cron 表达式能表达的。
Cron 表达式解析免费吗,会上传吗
完全免费,不需要注册,也没有次数限制。解析规则表随页面一起打包下发,全部计算都在你的浏览器里完成, 你输入的表达式不会出现在任何网络请求的地址或请求体里,我们这边既拿不到也不保存。 本地存储里只有方言、时区、条数、示例库是否展开这几项视图偏好,交互区里有一键清除。 页面里预留的广告位当前是关闭状态。规则与文案版本 2026.08。
需要在浏览器里做别的开发者小事?UUID 生成器 生成唯一任务 ID,JWT 解码器 看令牌里的过期时间,都是同样的本地计算、不上传。
如何使用Cron 表达式工具
把一条 Cron 表达式粘进输入框,crontab 整行、CRON_TZ= 前缀、@daily 这类快捷写法都能直接贴,多出来的命令会被自动剥离。
上方选方言与时区:自动判断认不准时可手动切到 Linux crontab、Quartz 或 Spring;时区决定下面那张执行时间列表按哪个偏移展示。
看结果:最上面一句是中文含义,往下是逐段拆解、提示条,再往下是上一次执行时间与接下来 N 次执行时间,条数可以在 1~50 之间调。
不会写就反过来用生成器:点「每周某几天」这类预设、勾上星期与时刻,表达式会直接写回输入框;结果可以复制成文本或下载成 TSV。
关于Cron 表达式工具的常见问题
- Cron 表达式怎么解析成中文含义
- 把表达式粘进本页最上面的输入框即可,不需要点任何按钮。页面会给出三样东西:一句可以直接引用的中文含义,比如「每周一至周五 09:30 执行」;一张逐段拆解表,说明每一段管哪个时间单位、展开成了哪些具体值;以及按你选的时区算出的接下来若干次执行时间。整个过程在浏览器本地完成,表达式不会上传。如果解析失败,页面会一次列出所有出错的字段,标明是第几段、原文是什么、为什么不合法,并给一句建议写法,而不是只报第一条错误。
- cron 里 0 0 * * * 是什么意思,每天几点执行
- 它表示每天 00:00 执行,也就是每天零点整跑一次。这是一条标准的 5 段 crontab 表达式,五段从左到右依次是分、时、日、月、周:第一段 0 表示第 0 分钟,第二段 0 表示 0 点,后面三段都是星号,表示每一天、每个月、每个星期都不限制。要注意别把它和 6 段写法搞混:Quartz 里的 0 0 * * * ? 因为最前面多了一段秒,含义变成每小时的第 0 分 0 秒执行,也就是每小时一次。判断段数是读懂一条 cron 表达式的第一步。
- cron 的 */5 * * * * 是每 5 分钟执行一次吗
- 是的,它表示每 5 分钟执行一次,命中的分钟是 0、5、10 一直到 55,一小时 12 次、一天 288 次。斜杠的语义是「从起点开始每隔 n 个单位」,不是「能被 n 整除」,虽然在起点为 0 时两种理解结果相同。区别在起点不为 0 的时候:cron 每 5 分钟写成 5/15 就变成了从第 5 分钟开始每 15 分钟一次,命中 5、20、35、50,而不是 0、15、30、45。另外要提醒的是,5/15 这种不带范围的裸步长写法在标准 Vixie crontab 上不保证支持,可移植的写法是 5-59/15,本页遇到时会给提示。
- cron 表达式每 30 分钟执行一次怎么写
- Linux crontab 写成 */30 * * * *,命中每小时的第 0 分和第 30 分;写成 0,30 * * * * 完全等价。Quartz 要在最前面补一段秒,写成 0 0/30 * * * ?,它习惯用起点加步长的 0/30 写法,含义与 */30 相同;Spring 写成 0 */30 * * * *。cron 表达式每 10 分钟就把 30 换成 10。这类写法间隔均匀,是因为 30 和 10 都能整除 60,换成 40 或 45 分钟就会长短不一。只想在工作时间跑,把小时字段收窄成 9-18 即可。
- Cron 表达式怎么算下次执行时间
- 在本页选好时区后,页面会直接列出接下来 N 次执行时间,默认 10 条,可以在 1 到 50 之间调,同时还会给出上一次执行时间和未来 24 小时、7 天内的执行次数。算法是按字段跳跃搜索:年不匹配就跳到下一个允许的年,月不匹配就跳月,日不匹配就跳天,因此像 0 0 29 2 * 这种四年一次的表达式也能瞬间算完。要特别说明口径:本页按固定偏移时区计算,不处理夏令时;真实的 cron 按运行它的服务器的本地时区执行,跨时区部署时以服务器设置为准。
- Cron 表达式 5 段和 6 段有什么区别
- 5 段是 Linux crontab 的标准写法,依次是分、时、日、月、周,最细只能到分钟,没有秒也没有年。6 段是 Quartz 和 Spring 的写法,最前面多了一段秒,变成秒、分、时、日、月、周,所以 cron 表达式秒一定在最前面而不是最后。7 段是 Quartz 独有的,在 6 段后面再加一段年,取值 1970 到 2099,可以省略。麻烦的地方在于光看 6 段分不出是 Quartz 还是 Spring,甚至可能是有人在 crontab 后面多写了一段命令,所以本页遇到 6 段会默认按秒在最前解释并给出歧义提示,你可以手动切换方言看另一种解释。
- Spring 的 @Scheduled cron 表达式怎么写
- Spring 的 @Scheduled 用 6 段,最前面是秒,依次为秒、分、时、日、月、周,所以每天早上 9 点整写成 0 0 9 * * *,比 crontab 多一段秒。星期编号与 crontab 一致:0 和 7 都表示周日、1 表示周一,这一点和 Quartz 相反,从 Quartz 抄过来的表达式别再把星期整体加一。Spring 支持问号但不强制,日和周可以同时写具体值,此时按并集执行;L、W、# 三个扩展字符也都认。把本页顶部的方言切到 Spring,解析与生成都会按这套规则来。
- Quartz 的 cron 里 1 是周一还是周日
- 在 Quartz 里 1 是周日,2 才是周一,一直到 7 表示周六,而且 Quartz 的周字段没有 0,写 0 会直接报错。Linux crontab 和 Spring 则相反:0 表示周日、1 表示周一,而且 0 和 7 都可以表示周日,两种写法等价。这个差一位的问题是从 crontab 迁移到 Quartz 时最常见的线上事故:crontab 的工作日任务 0 9 * * 1-5 直接照搬成 0 0 9 ? * 1-5 会变成周日到周四执行,周五漏跑、周日白跑,正确写法是 0 0 9 ? * 2-6。用英文缩写 MON-FRI 可以绕开这个坑,因为三种方言对名称的理解是一致的。本页在识别到 Quartz 数字周时会常驻一条提示。
- cron 里 0 和 7 都表示周日吗
- 在 Linux crontab 和 Spring 里是的,0 和 7 都表示周日,写哪个都一样,这是为了兼容不同 Unix 实现的历史习惯而保留的双写法。所以 0 0 * * 0 和 0 0 * * 7 是完全等价的两条表达式,都表示每周日零点执行。但在 Quartz 里不是:Quartz 的周字段取值只有 1 到 7,1 表示周日、7 表示周六,根本没有 0 这个值,写了会报错。判断 cron 0 是周几之前,先看清楚这条表达式是哪个方言的,本页顶部的方言选择器就是干这件事的。
- cron 表达式里的问号是什么意思
- 问号表示「不指定」,只能用在日和周这两个字段上,而且是 Quartz 和 Spring 的语法,标准 Linux crontab 并不认识它。它存在的原因是日和周这两个字段会互相干扰:如果你只想说「每周五执行」,日字段就不该再限制,写成问号比写星号更能表达「这一段我不关心,交给另一段决定」。Quartz 更进一步,要求日和周恰好有一个写成问号,两个都写具体值或者两个都写问号都会报错。Spring 不强制这条规则,两个都写具体值是合法的,此时按并集执行。本页遇到 crontab 表达式里出现问号时会按星号处理,并提示你这可能是一条 Quartz 表达式。
- Cron 的日和周同时写会怎么执行
- 取并集,也就是「或」的关系:只要满足其中一个条件就会执行,不是两个都满足才执行。举个最经典的例子,0 0 13 * 5 的含义是「每月 13 号执行,或者每个周五执行」,而不是「13 号并且是周五时执行」。这条规则来自 Vixie cron 的实现,Spring 也遵循同样的语义,是全网被写错最多的一条 cron 语义。想验证不必背规则,把这条表达式贴进本页,执行时间列表里会同时出现 13 号和各个周五,一眼就能看出来。要表达「且」的语义,cron 本身做不到,通行做法是把周条件放宽成星号,然后在脚本开头用 date 命令判断一次,不满足就直接退出。Quartz 因为强制日和周恰好有一个是问号,从语法层面就避免了这个歧义。
- cron 表达式里的 L、W、# 分别怎么用
- 这三个都是 Quartz 与 Spring 的扩展字符,标准 crontab 不支持。L 用在日字段表示当月最后一天,写成 L-3 表示最后一天前 3 天;用在周字段时跟在数字后面,比如 6L 表示当月最后一个周五。W 用在日字段表示离指定日期最近的工作日,15W 表示离 15 号最近的那个周一到周五,遇到周末会前后顺延,但绝不跨月;LW 组合起来表示当月最后一个工作日。井号写成 x#n 的形式,表示当月第 n 个星期 x,比如 6#3 是每月第 3 个周五,n 只能是 1 到 5,某些月份没有第 5 个时会自然跳过而不是报错。这三个字符本页都完整支持,可以直接在上面试。
- @daily、@hourly 这些 cron 快捷写法怎么写
- crontab 提供了一组 @ 开头的快捷写法,本质上是几条常用表达式的别名:@yearly 和 @annually 等于 0 0 1 1 *,@monthly 等于 0 0 1 * *,@weekly 等于 0 0 * * 0,@daily 和 @midnight 等于 0 0 * * *,@hourly 等于 0 * * * *。它们的好处是一眼能看懂,坏处是不能微调时刻,想改成凌晨 3 点就只能写回完整表达式。还有一个特殊的 @reboot,表示系统开机时执行一次,它没有固定时间点,因此任何工具都算不出它的下次执行时间,本页会明确说明而不是编一个时间给你。K8s CronJob 支持这些 @ 写法,但 @reboot 在集群里没有意义。
- 每周一到周五早上 9 点的 cron 怎么写
- Linux crontab 写成 0 9 * * 1-5,五段依次是分 0、时 9、日不限、月不限、周一到周五。Quartz 要写成 0 0 9 ? * 2-6,注意三处不同:最前面补一段秒 0、日字段必须写成问号、星期编号整体加一(Quartz 的 2 才是周一)。Spring 写成 0 0 9 * * 1-5,补秒但星期编号与 crontab 一致。想避开编号差异,三种方言都可以用英文缩写写成 MON-FRI,含义完全相同且不会记错。cron 工作日执行还有一个常被忽略的点:这里的工作日只是周一到周五,法定节假日和调休上班日 cron 是不知道的,需要在脚本里自己查日历。
- 每月最后一天执行的 cron 表达式怎么写
- Quartz 和 Spring 里直接用 L,写成 0 0 2 L * ? 就是每月最后一天凌晨 2 点执行,不用关心这个月是 28、29、30 还是 31 天。想要最后一天前几天用 L-3,想要当月最后一个工作日用 LW。标准 Linux crontab 没有 L,cron 最后一天只能绕:常见做法是写 0 2 28-31 * *,让它在每月最后四天都触发,然后在脚本第一行判断明天是不是下个月,不是就直接退出,判断语句通常写成 test $(date -d tomorrow +%d) -eq 1。另一种更省事的做法是改成每月 1 号凌晨跑,处理上个月的数据,语义上往往更清晰,也避开了月末天数不固定的整个问题。
- Cron 表达式在线生成器怎么用
- 在交互区下方的生成器里点选预设即可:每分钟、每 N 分钟、每小时、每天某时刻、每周某几天、每月某几号、每年某月某日,选完时刻和星期,表达式会实时写回上面的输入框,同时中文含义和执行时间列表跟着更新。切换方言时生成器会按该方言重新拼装,比如同一个「每天 09:30」,crontab 是 30 9 * * *,Quartz 是 0 30 9 * * ?。反过来,你手写的表达式如果落在生成器能表达的范围内,界面会自动摆到对应预设上;超出范围时会落到「高级」并给出提示,但输入框里的原文一个字都不会被改写。
- Cron 表达式按什么时区执行,夏令时怎么算
- cron 表达式本身不带时区信息,真实执行时按运行它的那台机器的本地时区来。所以同一条 0 0 3 * * 部署在 UTC 服务器上是伦敦时间凌晨 3 点,部署在国内服务器上是北京时间凌晨 3 点,跨时区团队最容易在这里出事故。要显式指定,crontab 可以在文件里写 CRON_TZ=Asia/Shanghai,K8s CronJob 用 spec.timeZone 字段,Quartz 在 CronTrigger 上设置 TimeZone。夏令时是另一个坑:切换当天会出现某个小时不存在或者重复出现,各家实现对这一小时里的任务是跳过还是补跑并不一致。本页只提供固定偏移的时区档位、明确不处理夏令时,宁可少算也不猜一个可能是错的答案;真要跑在有夏令时的地区,请以目标运行时的文档为准。
- Cron 表达式解析会上传吗,免费吗
- 完全免费,不需要注册、不需要下载客户端,也没有次数限制。解析规则和全部计算逻辑随页面一起打包下发,你粘贴的表达式在浏览器本地解析、本地推算执行时间,不会出现在任何网络请求的地址或请求体里,我们这边既拿不到也不保存。本地存储里只有方言、时区、列出条数、示例库是否展开这四项视图偏好,交互区里有一键清除按钮。之所以能免费,是因为这是纯前端计算,我们没有按次产生的服务器成本,自然不必用登录或配额来限制你。
- K8s CronJob 的 schedule 和 crontab 写法一样吗
- 基本一样:k8s cronjob schedule 用的就是标准 5 段 crontab 语法,分、时、日、月、周,也支持 @daily 这类快捷写法,日和周同时限定时同样取并集。差别有三处。第一,没有秒字段,K8s 的最小调度粒度是分钟,想要秒级只能在容器里自己 sleep。第二,@reboot 在集群里没有意义,不要写。第三,时区可以用 spec.timeZone 显式指定,不写就跟随控制器所在的时区,这和裸机 crontab 跟随本机时区不同。另外 CronJob 还有 startingDeadlineSeconds 和并发策略两个配置,决定错过的任务补不补跑、上一次没结束时新的要不要起,这些不是 cron 表达式能表达的。
- cron 表达式配好了不执行怎么排查
- 先在本页确认写法本身没错:贴进去看中文含义和下次执行时间,若显示永不执行或时刻不对,cron 表达式不执行的原因就在表达式自己身上。语法没问题还是不跑,按这个顺序查 cron 定时任务不执行的四个常见原因:一是时区,crontab 按服务器本地时区执行,容器镜像里默认常是 UTC,比北京时间差 8 小时;二是环境变量,cron 的 PATH 很短也不加载登录脚本,命令要写绝对路径;三是 crontab 文件最后一行必须以换行结尾,否则整行被忽略;四是命令里的百分号在 crontab 里表示换行,要写成反斜杠加百分号。把输出重定向到日志文件能省掉大半排查时间。
- Cron 表达式支持哪些写法,输入有长度限制吗
- 三种方言都支持:Linux crontab 的 5 段、Quartz 的 6 段与 7 段、Spring 的 6 段,段数与方言由页面自动判断,判断不对可以在上方手动切换。@daily、@hourly 这类快捷写法会先展开成等价表达式再计算,只有 @reboot 没有固定时间点,本页不会替它编一个。Quartz 的 ? L W # 四个扩展字符全部支持。粘贴时也不必先清理:整行 crontab 后面的命令、CRON_TZ= 前缀、行尾注释都会被自动剥离。输入长度上限 512 个字符,超出部分会被截断并给出提示;执行时间一次最多列 50 条,向前向后各搜索 12 年。
- 手机上能用 Cron 表达式解析工具吗
- 可以,本页是纯前端页面,用手机浏览器直接打开就能用,不需要装任何 App。窄屏下逐段拆解会从横向排列自动变成纵向堆叠,速查表和执行时间列表可以横向滑动查看,长表达式也不会把页面撑出屏幕。运维在手机上收到告警要临时确认一条表达式什么时候跑,或者在通勤路上先把定时任务的时间想清楚,都可以直接用。要把结果发给同事,用交互区的「复制深链」按钮,生成的链接带上了表达式、方言和时区,对方打开就是同样的状态。