近期在使用cron表達(dá)式,同時(shí)使用quartz和schedule的CronExpression董瞻,發(fā)現(xiàn)兩個(gè)cron處理類獲取下次的執(zhí)行時(shí)間居然是不一致的帽借,記錄
一下妓盲。
1浩嫌、crontab表達(dá)式
crontab表達(dá)式是一個(gè)設(shè)置周期性被執(zhí)行的指令檐迟,是一種很常用的技術(shù),通過設(shè)置crontab周期性的去執(zhí)行或者處理你所需要的命令码耐,包含五到七位的字段來表達(dá)一個(gè)時(shí)間追迟。
字段 | 是否必填 | 允許值 | 允許特殊字符 | 備注 |
---|---|---|---|---|
Seconds | 是 | 0–59 | *``,``- |
標(biāo)準(zhǔn)實(shí)現(xiàn)不支持此字段。 |
Minutes | 是 | 0–59 | *``,``- |
|
Hours | 是 | 0–23 | *``,``- |
|
Day of month | 是 | 1–31 | *``,``-``?``L``W |
?``L``W 只有部分軟件實(shí)現(xiàn)了 |
Month | 是 | 1–12 or JAN–DEC | *``,``- |
|
Day of week | 是 | 0–7 or SUN–SAT | *``,``-``?``L``# |
?``L``# 只有部分軟件實(shí)現(xiàn)了 Linux和Spring的允許值為0-7骚腥,0和7為周日 Quartz的允許值為1-7怔匣,1為周日 |
Year | 否 | 1970–2099 | *``,``- |
標(biāo)準(zhǔn)實(shí)現(xiàn)不支持此字段。 |
五位cron表達(dá)式就是沒有秒和年
**0 0 * * *** 代表每天的凌晨
六位cron表達(dá)式就是沒有年
0 0 18 25 * ? 代表每個(gè)月的25號(hào)的下午6點(diǎn)
七位cron表達(dá)式則都包含
0 0 18 25 * ? 2021代表2021年每個(gè)月的25號(hào)下午六點(diǎn)
符號(hào)具體使用就如下圖所示桦沉,以上就是cron表達(dá)式具體解釋和基本用法
2、spring schedule和quartz的CronExpression差異
在使用兩者CronExpression發(fā)現(xiàn)同一個(gè)表達(dá)式的下次時(shí)間居然有一些差異金闽,例如下圖的cron表達(dá)式本意是想指定周一纯露、周二、周五的每個(gè)小時(shí)每隔五分鐘就執(zhí)行一次代芜,但是發(fā)現(xiàn)兩者下次的執(zhí)行時(shí)間的天不一致埠褪,通過quartz得到的下次執(zhí)行時(shí)間是星期天去執(zhí)行,而spring的代表著是星期一執(zhí)行挤庇。
quartz是將數(shù)字1代表星期天2代表星期一钞速,month月份位置的數(shù)字也是一樣的0代表一月
而spring CronExpression的數(shù)字1代表的就是星期一或者一月份,它是將cron表達(dá)式的幾位單獨(dú)拆開然后還去將每個(gè)位置的日期進(jìn)行格式轉(zhuǎn)換嫡秕。
如果crontab有英文代表的話它會(huì)將英文都轉(zhuǎn)成數(shù)字表示如果本身是數(shù)字那就不會(huì)轉(zhuǎn)換渴语,如果是MON,TUE,FRI英文那么會(huì)轉(zhuǎn)成1,2,5。
同時(shí)cron表達(dá)式不能同時(shí)指定dayofweek和dayofmonth這樣會(huì)導(dǎo)致cron不知道具體哪天去執(zhí)行昆咽,導(dǎo)致crontab不合法驾凶。