任务调度 Cron表达式详解

Cron表达式是一种用于配置定时任务执行时间的字符串,在java应用开发中被广泛应用于任务调度框架(如Quartz)的任务执行时间。


一、Cron表达式的结构

一个标准的Cron表达式由 7个字段组成,字段间用空格分隔。各字段顺序如下:

字段取值范围支持的符号说明
秒 (Seconds)0-59* , - / ? L #分钟内的秒数(Quartz特有字段)
分 (Minutes)0-59* , - /小时内的分钟数
时 (Hours)0-23* , - /一天中的小时数
日 (Day of Month)1-31* , - / ? L W月份中的日期
月 (Month)1-12 或 JAN-DEC* , - /月份
周 (Day of Week)0-7 或 SUN-SAT* , - / ? L #星期(0和7均代表星期日)
年 (Year) [可选]1970-2099* , - /年份(Quartz特有字段)

注意

  • 配置cron表达式时应该从左到右进行配置,依次为秒、分、时、日、月、周、年

  • 在Java中使用Quartz等调度框架 时通常使用6个字段(秒、分、时、日、月、周),年为可选字段。


二、字符详解

字符说明示例
*匹配任意值* * * * * ? 每分钟执行
,指定多个值0 5,15 * * * ? 每小时5分和15分执行
-指定范围0 9-17 * * * ? 9点到17点每小时执行
/步长(间隔触发)0 0/5 * * * ? 每5分钟执行(从0分开始)
?不指定值(仅用于字段,互斥逻辑)0 0 12 * * ? 每天中午12点执行
L最后(Last): - 日字段:月份最后一天(如L) - 周字段:星期六(如6L0 0 0 L * ? 每月最后一天零点执行
W最近工作日(Workday),避免周末0 0 0 15W * ? 每月15日最近的工作日执行
#指定第N个周几0 0 12 ? * 2#3 每月第3个周一中午12点执行

三、陷阱

  1. 日与周字段互斥
    • 避免同时指定字段的值(除非需要两者独立触发)。
    • 使用 ? 忽略其中一个字段(例如:0 0 0 ? * MON0 0 0 1 * ?)。
  2. 取值范围冲突
    • 日期字段需考虑月份天数(如2月30日无效)。
    • 周字段:1-7(1=周日, 2=周一, …, 7=周六)或 SUN-SAT
  3. L/W/#的兼容性
    • L, W, # 仅部分系统支持(如Quartz)。

四、示例

基础场景
描述Cron表达式说明
每分钟执行0 * * * * ?每分钟的0秒触发
每小时15分30秒执行30 15 * * * ?每小时的第15分30秒触发
每天凌晨3点执行0 0 3 * * ?
每月1日中午12点执行0 0 12 1 * ?
每周五下午4点执行0 0 16 ? * FRI忽略日字段
2025年每小时执行0 0 * * * ? 2025Quartz特有(带年份)
复杂场景
描述Cron表达式说明
工作日上午9点到下午5点,每30分钟执行0 0/30 9-17 ? * MON-FRIMON-FRI :周一至周五
每月最后一天18点执行0 0 18 L * ?L表示最后一天
每月第3个周三上午10点执行0 0 10 ? * 4#34=周四(周日=0),#3=第3个
每日8:00至17:00,每20分钟执行0 0/20 8-17 * * ?从8:00, 8:20, …, 16:40, 17:00
每月15日最近的工作日执行0 0 0 15W * ?15W: 15日最近的工作日(避开周末)

总结

  • cron表达式从左到右,依次为秒、分、时、日、月、周、年
  • cron表达式中年为可选字段
  • 避坑:日/周字段互斥时用?,验证取值范围,避免冲突。

熟悉cron表达式的使用,可以有效的提高我们配置定时任务时的工作效率,通过不同的组合,以满足不同任务的执行需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值