cron表达式的那些坑

cron表达式踩过的坑,记录一下:

1、关于cron表达周的问题(在SpringBoot的调度中遇到)

  • 首先有一个确定的规则:MON TUE WED THU FRI SAT SUN 分别表示周一、周二、周三、周四、周五、周六、周日。
  • 但是有个问题在这里面:当你使用0-6或者1-7来表达周的时候,很多人说1是星期天,7是周六,这个在一些cron表达式生成的网站上反向解析是没问题的,但是当你实际使用时,你就会发现,表达式是0 0 4 ? * 1的任务会在周一凌晨执行,表达式为0 0 4 ? * 0或者0 0 4 ? * 7的时候,任务会在周日执行。
  • 综上,我们可以看出,当你使用数字标识周的时候,可能1-6标识周一到周六,0,7标识周日。但是这个并不准确,原理上是为什么,我也目前还不了解。
  • 但是如果想避开这个问题,用MON TUE WED THU FRI SAT SUN 分别表示周一、周二、周三、周四、周五、周六、周日最稳妥

2、关于cron表达式使用 “-” 时的时间范围问题

  • 首先说一下今天搜索时普遍描述的内容,大部分的描述是说在cron表达式中的时、分、秒、年等属性中使用 “-”,例如在小时中写8-11,是包含8、9、10、11的
  • 这个说法看起来没有问题,实际上也没有问题,但是分怎么理解。有这么一种理解方式,是错的。【8-11,表示的是8、9、10、11,那就是[8,10]这样一个闭区间的问题】这是错误的
  • 那么正解是什么呢?
  • cron表达式,从实际意义来讲,他是一个整体,但是他的判断逻辑是分开进行判断的,各个单位之间是用 “且” 的条件组合的。
    在这里插入图片描述
  • 也就是当时间符合表达式的秒、分钟、小时、日、月、星期、年,你的表达式调用的调度服务才会执行
  • 引申出来的问题,也就是我当时看的问题
  • 0 0-59/15 8-11 * * ? 这个表达式代表了什么? 我一开始的理解是在每天的8-11点中,每隔15分钟执行一次
  • 但是为什么解析出来之后,会出现在11:45执行的情况?
    在这里插入图片描述
  • 就是因为上面我讲的与关系
  • 我们来看11:45这个时间,11点是不是满足8-11,45是不是满足15分钟一次的间隔,并且45在0-59之间。所以11:45这个表达式会执行。同理:11:15、11:30这个表达式也都会执行。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值