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 多写了一段。本次按「秒 分 时 日 月 周」解释,可在上方切换方言。

当前表达式超出可视化生成器的表达范围,已切到「高级」,仅显示解析结果,输入框内容未被改写。

逐段拆解

字段原文取值范围这一段的意思
00-590
分钟300-5930
小时30-233
*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 表达式在线解析这件事,难的从来不是把字符串切开,而是三件容易出错的小事:方言判断、日与周的并集语义、 以及按哪个时区算。本页的做法是——拿不准就明说,不替你拍板:

  1. 先定方言:5 段按 Linux crontab 解释,6 段默认按「秒在最前」解释并给出歧义提示, 7 段按 Quartz 带年字段解释。判断不对就在上方手动切换,切完立刻重算。
  2. 再展开每个字段:把通配、列表、范围、步长这四个基础字符(* , - /), 以及 Quartz 的 ? L W #,逐个展开成具体值集合。 这一步顺带做 cron 表达式校验,越界、步长为 0、范围反转都会一次列全,而不是只报第一条。
  3. 最后按字段跳跃搜索:从起算时刻出发,年不对就跳年、月不对就跳月、日不匹配就跳天, 不做逐分钟试探。这样 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 例外——它表示开机时执行,没有固定时间点,所以本页不会替它编造一个下次执行时间。

写法等价表达式含义
@yearly0 0 1 1 *每年 1 月 1 日 00:00 执行
@annually0 0 1 1 *与 @yearly 完全等价
@monthly0 0 1 * *每月 1 日 00:00 执行
@weekly0 0 * * 0每周日 00:00 执行
@daily0 0 * * *每天 00:00 执行
@midnight0 0 * * *与 @daily 完全等价
@hourly0 * * * *每小时的第 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-20991-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-55 段每周一至周五 09:00 执行工作日早上 9 点的日报提醒
0 18 * * 55 段每周五 18:00 执行每周五下班前的周报汇总
0 0 * * 05 段每周日 00:00 执行每周日零点的周度清理
0 9 * * MON5 段每周一 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-55 段每周一至周五 08:00、10:00、12:00、14:00、16:00、18:00 执行工作日白天每两小时巡检一次
0 0 13 * 55 段每月 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-FRI6 段或 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#36 段或 7 段每月第 3 个周五 02:00 执行每月第 3 个周五的例会提醒
0 0 2 ? * 6L6 段或 7 段每月最后一个周五 02:00 执行每月最后一个周五的版本发布
0 0 0 1 1 ? 20306 段或 7 段2030 年 1 月的 1 日 00:00 执行带年字段的一次性任务
0 30 9 * * *6 段每天 09:30 执行Spring @Scheduled 的 6 段写法
0 0 9 * * 1-56 段每周一至周五 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 表达式工具

1

把一条 Cron 表达式粘进输入框,crontab 整行、CRON_TZ= 前缀、@daily 这类快捷写法都能直接贴,多出来的命令会被自动剥离。

2

上方选方言与时区:自动判断认不准时可手动切到 Linux crontab、Quartz 或 Spring;时区决定下面那张执行时间列表按哪个偏移展示。

3

看结果:最上面一句是中文含义,往下是逐段拆解、提示条,再往下是上一次执行时间与接下来 N 次执行时间,条数可以在 1~50 之间调。

4

不会写就反过来用生成器:点「每周某几天」这类预设、勾上星期与时刻,表达式会直接写回输入框;结果可以复制成文本或下载成 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。窄屏下逐段拆解会从横向排列自动变成纵向堆叠,速查表和执行时间列表可以横向滑动查看,长表达式也不会把页面撑出屏幕。运维在手机上收到告警要临时确认一条表达式什么时候跑,或者在通勤路上先把定时任务的时间想清楚,都可以直接用。要把结果发给同事,用交互区的「复制深链」按钮,生成的链接带上了表达式、方言和时区,对方打开就是同样的状态。