05.Quartz cron 表达式详解

流过昼夜 提交于 2019-11-28 18:18:48

1. 简介

  • cron 是已经存在很长时间的Unix的一个工具, 它的功能很强大, 也得到了时间的证明. Quartz 的CronTrigger 也是基于cron 进行调度的
  • CronTrigger 使用cron 表达式来定义调度的时间规则
  • cron 表达式功能时非常强大的, 也是非常复杂的, 由六段或七段组成, 容易产生困惑.

2. cron 表达式格式

cron 表达式由空格分割的六段或七段组成, 每一段代表的时间单位不同, 取值也有所不同.

  • 星期缩写: SUN, MON, TUE, WED, THU, FRI ,SAT
  • 月份缩写: JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC

2.1 字段取值范围

序号 含义 取值范围 允许特殊字符
1 Seconds(秒) 0-59 , - * /
2 Minutes(分) 0-59 , - * /
3 Hours(时) 0-23 , - * /
4 Day-of-Month(日) 1-31 , - * ? / L W LW
5 Month(月) 0-11, 或JAN-DEC , - * /
6 Day-of-Week(星期) 1-7(1代表周日), 或SUN-SAT , - * ? / L #
7 Year(年) , - * /

2.2 特殊符号

  • * : 表示该字段每一单位都会执行一次. 如果在Minutes位, 则表示每一分钟; 如果在Hours位, 则表示每一小时…
  • , : 用于列举枚举多个具体的值, 中间不能有空格. 如:“MON,WED,FRI” 表示每周一, 周三, 周五; “JAN,MAR,MAY” 表示一月, 三月, 五月
  • - : 用于表示连续范围.如"1-3"在Hours位,表示1点, 2点, 3点
  • / : 用于指定以某一时间点开始, 固定增量触发. 如Minutes位 15/20 表示每小时的15分, 35分, 55分触发一次, 并不是不是说每隔20分钟触发
  • ? : 用于限制Day-of-Month 和 Day-of-Week 只能选择一种方式, 只能位于这两个位置, 且这两个位置有且只能有一个位置时?
  • L : 表示最后, 只能位于Day-of-Month 和 Day-of-Week, 不同的位置意义不同
    • Day-of-Month: L 表示本月最后一天,3月是31日, 4月是30日; L-3 表示本月倒数第三天
    • Day-of-Week: L 表示每周周最后一天, 即本月每个周六; FRIL 则表示本月最后一个周五.
  • # : 表示每个月的第几个星期几, 只能位于 Day-of-Week. 如FRI#3 表示本月第三个周五
  • W : 表示工作日, 即周一到周五, 只能位于 Day-of-Month. 和数字连用时, 如15W表示距离15号最近的一个工作日
  • LW: 表示最后一个工作日, 只能位于Day-of-Month.

3. 常用cron 表达式举例

笔者参考官方文档以及个人日常使用整理一些常用的cron 表达式.

cron 描述
0 0 12 * * ? 每天12:00 触发一次
0 15 10 ? * * 每天10:15 触发一次
0 15 10 * * ? 2019 2019年每天10:15触发一次
0 * 14 * * ? 每天14点的每分钟触发一次
0 0/25 14 * * ? 每天14点每隔25分钟触发, 触发时间点14:00, 14:25, 14:50
0 0/25 14,18 * * ? 每天14点, 18点每隔25分钟触发, 触发时间点14:00, 14:25, 14:50 ,18:00, 18:25, 18:50
0 0/25 14,15 * * ? 每天14点到18点之间, 每小时的00, 25, 50 分钟执行一次. 并非是从14点开始每隔25分钟执行一次; 触发时间点14:00, 14:25, 14:50 ,15:00, 15:25, 15:50
0 0-5 14 * * ? 每天14点0分钟到5分钟每分钟触发一次, 触发时间点14:00, 14:01, 14:02, 14:03, 14:04, 14:05
0 15,45 15 ? 3 WED 3月的每周三15点15分和15点45触发
0 15 10 ? * MON-FRI 每周一到周五10点15触发
0 15 10 ? * SAT,SUM 每周六周日10:15触发
0 15 10 L * ? 每个月最后一天的10:15 触发
0 15 10 L-3 * ? 每个月倒数第三天的10:15触发
0 15 10 LW * ? 每个月最后一个工作日的10:15触发
0 15 10 W * ? 每个工作日的10:15触发
0 15 10 ? * L 每周六的10点15触发
0 15 10 ? * 6L 每个月最后一个周六的10点15触发
0 15 10 ? * 6#3 每个月第三个周六的10点15触发
0 0 12 1/5 3 ? 3月1号开始每隔5天12点触发
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!