Cron 表达式

Cron 表达式是一个字符串,用于定义任务执行的时间规则,通常由 6 或 7 个字段组成,中间用空格分隔。Spring Task、Quartz 等框架都支持使用 Cron 表达式来配置定时任务。

Cron 表达式的基本格式

秒 分 时 日 月 周 [年]
  • 年(可选):范围 1970-2099,通常省略。
  • :范围 1-12 或英文缩写 JAN-DEC
  • :范围 1-7 或英文缩写 SUN-SAT(1 表示周日),部分系统支持 0-6(0 表示周日)。

常用通配符

符号含义示例
*任意值* * * * * ? 表示每分钟执行一次
?不指定值(用于日和周字段冲突时)0 0 12 ? * WED 表示每周三中午 12 点
-范围10-15 * * * * ? 表示每分钟的 10-15 秒执行
,多个值MON,WED,FRI 表示周一、周三、周五
/间隔0/5 * * * * ? 表示每 5 秒执行一次
L最后(Last)L 在日字段表示每月最后一天,在周字段表示最后一个周几(如 6L 表示每月最后一个周五)
W工作日(Weekday)15W 表示离每月 15 日最近的工作日
#第几个周几6#3 表示每月第三个周五(6 对应周五,3 表示第三个)

常见 Cron 表达式示例

  1. 每分钟执行一次

    0 * * * * ?
  2. 每小时的 0 分 0 秒执行

    0 0 * * * ?
  3. 每天凌晨 2 点执行

    0 0 2 * * ?
  4. 每天早上 8:30 执行

    0 30 8 * * ?
  5. 每 5 分钟执行一次

    0 0/5 * * * ?
  6. 周一至周五的 9:00-18:00 每小时执行

    0 0 9-18 * * MON-FRI
  7. 每月 1 日和 15 日的中午 12 点执行

    0 0 12 1,15 * ?
  8. 每月最后一天的 23:59 执行

    59 59 23 L * ?
  9. 每月最后一个周五的 17:00 执行

    0 0 17 ? * 6L
  10. 每年元旦(1月1日)的 00:00 执行

    0 0 0 1 1 ?

注意事项

  1. 日和周字段冲突

    • 当同时设置 字段时,需用 ? 忽略其中一个。例如:
      0 0 12 * * ?    # 每天中午12点(周字段忽略)
      0 0 12 ? * MON # 每周一中午12点(日字段忽略)
  2. 不同系统的差异

    • 部分系统(如 Linux 的 crontab)不支持秒字段,只有 5 个字段(分 时 日 月 周)。
    • 周字段的起始值可能不同(如 0-61-7),需参考具体框架的文档。
  3. 测试工具

Spring Task 中的特殊字符

Spring Task 额外支持:

  • *(星号):表示所有可能的值。
  • H(Hash):用于生成散列值,适合分布式系统负载均衡。例如:
    0 0 H * * ?    # 每天随机时间执行(由框架分配)

通过组合这些符号,你可以灵活定义各种复杂的定时任务规则。