Cron 表达式解析器

格式:minute hour day-of-month month day-of-week

你接手了一个 crontab,里面满是 0 */2 * * 1-515 4 1 * **/30 8-18 * * * 这样的任务。该解析器接受标准的 5 字段 cron 表达式,返回通俗易懂的英文说明(例如 “every 2 hours on weekdays”),并列出它接下来实际触发的 5 个时间点。非常适合用来理解遗留的调度任务,并在部署新任务前先做验证。

如何解析 cron 表达式

  1. 1

    粘贴表达式

    一个标准的 5 字段表达式(`* * * * *`):分钟、小时、日(月内)、月份和星期。

  2. 2

    阅读英文说明

    解析器会用简单的英文改写每个字段,例如 "At minute 0, every 2 hours, on day(s) of week 1-5."

  3. 3

    用下次运行预览进行验证

    接下来的 5 个触发时间。如果与你的意图不符,请调整表达式。

  4. 4

    修正无效字段

    字段数量不对或取值超出范围的表达式会被拒绝,并给出指明问题字段的错误提示。

解读每个字段

每个字段都有各自的有效范围和特殊字符:

字段 范围 支持的通配符
分钟 0-59 * , - /
小时 0-23 * , - /
日(月内) 1-31 * , - /
月份 1-12 * , - /
星期 0-7 * , - /
  • * = 任意值(分钟字段中的 * 表示每分钟)。
  • 1,5,10 = 值的列表。
  • 1-5 = 值的范围。
  • */150-45/15 = 步进,从字段范围的开头起算。
  • 星期 07 都表示周日,两种习惯写法均可。不接受 JAN、MON 这类月份和星期的名称,请使用数字。

示例解读

表达式 英文说明
0 */2 * * 1-5 At minute 0 every 2 hours, Monday through Friday
15 4 1 * * At 04:15 on the 1st day of every month
*/30 8-18 * * * Every 30 minutes between 08:00 and 18:59
0 0 1,15 * * At midnight on the 1st and 15th of every month
0 22 * * 0 At 22:00 every Sunday

解析器接受什么

  • 恰好 5 个字段:分钟、小时、日(月内)、月份和星期。带秒(6 字段)或带年(7 字段)的 Quartz 表达式会被拒绝。
  • 有效范围:每个取值必须落在自己的字段范围内,例如分钟 0-59、小时 0-23、日(月内)1-31、月份 1-12、星期 0-7。
  • 正数步进/ 后面的值必须是正数(*/0 会被拒绝)。
  • 不接受命名快捷方式@daily@reboot 等快捷方式不被接受。请先将其展开为 5 字段形式(例如 @daily = 0 0 * * *)。

“日(月内)”与“星期”同时使用

当“日(月内)”和“星期”同时设置时,此解析器只会在两者都匹配时才安排运行,因此 0 0 1 * MON 只在 1 日恰好是周一那天触发。而大多数 Linux cron 实现会把这两个字段按“或”处理(任一匹配即运行)。请务必对照你实际使用的调度器核对该表达式。

关于时区的说明

预览中的时间按服务器时钟计算,服务器运行在 UTC。如果你的 crontab 运行在其他时区的机器上,这里显示的时间可能与那台机器上的时间不同。

常见问题

不支持。只接受标准的 5 字段表达式。带秒(6 字段)或带年(7 字段)的 Quartz 表达式会被拒绝并报错。

通常是以下原因之一:预览按服务器时钟(UTC)计算,而你的 crontab 运行在其他时区;同时设置了“日(月内)”和“星期”(此解析器要求两者都匹配);或步进值在每个小时或每天开始时重新起算。

可以,只要它是标准的 5 字段表达式,这正是 Kubernetes 使用的格式(默认按 UTC)。请注意这里的预览按服务器时钟(UTC)计算,如果集群运行在其他时区,时间可能会有差异。

Linux cron 支持以下命名快捷方式:@reboot(系统启动时)、@yearly / @annually(0 0 1 1 *)、@monthly@weekly@daily@hourly。此解析器不接受它们,请先把快捷方式展开为等价的 5 字段表达式再粘贴。

相关工具

此工具还提供其他语言版本