跳到正文
cron.surf

Quartz cron 转 Kubernetes

Quartz 的字段是 秒 分 时 日 月 星期 [年];Kubernetes 的字段是 分 时 日 月 星期。粘贴表达式即可转换,不能精确对应的部分会标出原因和替代写法。

“在00:00, 限每月的最后一天”

目标 · Kubernetes无法转换
  • 日: Kubernetes 没有“每月最后一天”。月底可能是 28 到 31 号,没有一个固定日期能匹配。

    替代写法在 28-31 号运行,只有明天是 1 号时才继续。需要 GNU date;crontab 里的 % 要写成 \%。
    0 0 28-31 * *  # job: [ "$(date -d tomorrow +%d)" = "01" ] || exit 0
    单独使用并不等价:需要在任务里加一行判断。

其他平台上的相同调度

crontab无法转换
  • 日: crontab 没有“每月最后一天”。月底可能是 28 到 31 号,没有一个固定日期能匹配。

    替代写法在 28-31 号运行,只有明天是 1 号时才继续。需要 GNU date;crontab 里的 % 要写成 \%。
    0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job
    单独使用并不等价:需要在任务里加一行判断。
GitHub Actions无法转换
  • 日: GitHub Actions 没有“每月最后一天”。月底可能是 28 到 31 号,没有一个固定日期能匹配。

    替代写法在 28-31 号运行,只有明天是 1 号时才继续。需要 GNU date;crontab 里的 % 要写成 \%。
    0 0 28-31 * *  # job: [ "$(date -d tomorrow +%d)" = "01" ] || exit 0
    单独使用并不等价:需要在任务里加一行判断。
cron(0 0 L * ? *)
cron() 六个字段,一个日期字段必须是 ?。不设时区就是 UTC。
Spring等价
0 0 0 L * *
六个字段,秒在前;设置 zone=,否则用服务器时区。

接下来 10 次运行

在你的浏览器中计算
  1. 计算中…

Quartz 与 Kubernetes 的区别

QuartzKubernetes
字段秒 分 时 日 月 星期 [年]分 时 日 月 星期
周日1(SUN=1 … SAT=7)0(7 会报错)
日和星期都设置时其中一个必须是 ?任一满足;只有 * 或 ? 算不限制
特殊字符L W # LW L-n无
简写无@yearly @monthly @weekly @daily @hourly
时区inTimeZone(),否则 JVM 时区spec.timeZone,否则控制器时区
最短间隔1 秒1 分钟

常用调度转换结果

QuartzKubernetes
每 5 分钟0 */5 * * * ?*/5 * * * *
每小时0 0 * * * ?0 * * * *
每分钟0 * * * * ?* * * * *
每 10 分钟0 */10 * * * ?*/10 * * * *
每 15 分钟0 */15 * * * ?*/15 * * * *
每 30 分钟0 */30 * * * ?*/30 * * * *
每天零点0 0 0 * * ?0 0 * * *
每天早上 9 点0 0 9 * * ?0 9 * * *
工作日早上 9 点0 0 9 ? * 2-60 9 * * 1-5
每周一0 0 0 ? * 20 0 * * 1
每月 1 号0 0 0 1 * ?0 0 1 * *
每 6 小时0 0 */6 * * ?0 */6 * * *
每周日零点0 0 0 ? * 10 0 * * 0
每 2 小时0 0 */2 * * ?0 */2 * * *
每 12 小时0 0 */12 * * ?0 */12 * * *
每天中午 12 点0 0 12 * * ?0 12 * * *
每周五0 0 0 ? * 60 0 * * 5
每月最后一天0 0 0 L * ?无法转换
每季度0 0 0 1 */3 ?0 0 1 */3 *
每 2 分钟0 */2 * * * ?*/2 * * * *
每 3 小时0 0 */3 * * ?0 */3 * * *
每天早上 6 点0 0 6 * * ?0 6 * * *
每天晚上 6 点0 0 18 * * ?0 18 * * *
每天两次0 0 */12 * * ?0 */12 * * *
工作日晚上 6 点0 0 18 ? * 2-60 18 * * 1-5
周末上午 10 点0 0 10 ? * 1,70 10 * * 0,6
每月 15 号0 0 0 15 * ?0 0 15 * *
每月第一个周一0 0 9 ? * 2#1无法转换
每月最后一个周五0 0 17 ? * 6L无法转换
每年一次0 0 0 1 1 ?0 0 1 1 *
每 30 秒*/30 * * * * ?无法转换
每 3 分钟0 */3 * * * ?*/3 * * * *
每 20 分钟0 */20 * * * ?*/20 * * * *
每 4 小时0 0 */4 * * ?0 */4 * * *
每 8 小时0 0 */8 * * ?0 */8 * * *
每天凌晨 1 点0 0 1 * * ?0 1 * * *
每天凌晨 2 点0 0 2 * * ?0 2 * * *
每天凌晨 3 点0 0 3 * * ?0 3 * * *
每天早上 8 点0 0 8 * * ?0 8 * * *
每个工作日0 0 0 ? * 2-60 0 * * 1-5
每个周末0 0 0 ? * 1,70 0 * * 0,6
每周二0 0 0 ? * 30 0 * * 2
每周三0 0 0 ? * 40 0 * * 3
每周四0 0 0 ? * 50 0 * * 4
每周六0 0 0 ? * 70 0 * * 6
每 6 个月0 0 0 1 */6 ?0 0 1 */6 *
每 10 秒*/10 * * * * ?无法转换
每 5 秒*/5 * * * * ?无法转换

常见问题

所有 Quartz 表达式都能转成 Kubernetes 吗?

不是全部。本页 48 个常用调度中有 42 个可以等价转换,其余需要替代写法,转换器会给出。

Quartz 和 Kubernetes 里周日怎么写?

Quartz:1(SUN=1 … SAT=7)。Kubernetes:0(7 会报错)。

时区会一起转过去吗?

表达式本身不带时区。Quartz:inTimeZone(),否则 JVM 时区。Kubernetes:spec.timeZone,否则控制器时区。