近期在使用cron表达式,同时使用quartz和schedule的CronExpression,发现两个cron处理类获取下次的执行时间居然是不一致的,记录
一下。
1、crontab表达式
crontab表达式是一个设置周期性被执行的指令,是一种很常用的技术,通过设置crontab周期性的去执行或者处理你所需要的命令,包含五到七位的字段来表达一个时间。
字段 | 是否必填 | 允许值 | 允许特殊字符 | 备注 |
---|---|---|---|---|
Seconds | 是 | 0–59 | *``,``- |
标准实现不支持此字段。 |
Minutes | 是 | 0–59 | *``,``- |
|
Hours | 是 | 0–23 | *``,``- |
|
Day of month | 是 | 1–31 | *``,``-``?``L``W |
?``L``W 只有部分软件实现了 |
Month | 是 | 1–12 or JAN–DEC | *``,``- |
|
Day of week | 是 | 0–7 or SUN–SAT | *``,``-``?``L``# |
?``L``# 只有部分软件实现了 Linux和Spring的允许值为0-7,0和7为周日 Quartz的允许值为1-7,1为周日 |
Year | 否 | 1970–2099 | *``,``- |
标准实现不支持此字段。 |
五位cron表达式就是没有秒和年
**0 0 * * *** 代表每天的凌晨
六位cron表达式就是没有年
0 0 18 25 * ? 代表每个月的25号的下午6点
七位cron表达式则都包含
0 0 18 25 * ? 2021代表2021年每个月的25号下午六点
符号具体使用就如下图所示,以上就是cron表达式具体解释和基本用法
2、spring schedule和quartz的CronExpression差异
在使用两者CronExpression发现同一个表达式的下次时间居然有一些差异,例如下图的cron表达式本意是想指定周一、周二、周五的每个小时每隔五分钟就执行一次,但是发现两者下次的执行时间的天不一致,通过quartz得到的下次执行时间是星期天去执行,而spring的代表着是星期一执行。
quartz是将数字1代表星期天2代表星期一,month月份位置的数字也是一样的0代表一月
而spring CronExpression的数字1代表的就是星期一或者一月份,它是将cron表达式的几位单独拆开然后还去将每个位置的日期进行格式转换。
如果crontab有英文代表的话它会将英文都转成数字表示如果本身是数字那就不会转换,如果是MON,TUE,FRI英文那么会转成1,2,5。
同时cron表达式不能同时指定dayofweek和dayofmonth这样会导致cron不知道具体哪天去执行,导致crontab不合法。