生活随笔
收集整理的這篇文章主要介紹了
cron表达式生成函数(小时部分自定义) 1小时30分钟,1小时20分钟,1小时40分钟..
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
cron表達(dá)式實(shí)例:
- 每1小時(shí)30分鐘執(zhí)行一次(間隔時(shí)間90分鐘)
使用兩條cron表達(dá)式實(shí)現(xiàn)每90分鐘執(zhí)行一次。
第一條以01:30為起點(diǎn),執(zhí)行周期為3小時(shí)。
第二條以00:00為起點(diǎn),執(zhí)行周期為3小時(shí)。(cron表達(dá)式間隔周期只能填整數(shù))
90 * 2=180=60 * 3(180分鐘是60分鐘的3倍,因?yàn)殚g隔周期只能為小時(shí)的整數(shù),所以間隔周期一定為60的倍數(shù))【也可以這樣想,間隔時(shí)間和60的最小公倍數(shù),這里就是90和60的最小公倍數(shù)是180】
//每1個(gè)半小時(shí)執(zhí)行(00:00,01:30,03:00,04:30...)
"0 30 1/3 * * ?" //01:30,04:30,07:30..
"0 0 0/3 * * ?" //00:00,03:00,06:00..
- 每1小時(shí)20分鐘執(zhí)行一次(間隔時(shí)間80分鐘)
使用三條cron表達(dá)式實(shí)現(xiàn)每80分鐘執(zhí)行一次。
第一條以01:20為起點(diǎn),執(zhí)行周期為4小時(shí)。
第二條以02:40為起點(diǎn),執(zhí)行周期為4小時(shí)。
第三條以04:00位起點(diǎn),執(zhí)行周期為4小時(shí)。
80 * 3=240=60 * 4
//每80分鐘執(zhí)行(01:20,02:40,04:00,05:20...)
"0 20 1/4 * * ?" //01:20,05:20,09:20..
"0 40 2/4 * * ?" //02:40,06:40,10:40..
"0 0 4/4 * * ?" //04:00,08:00,12:00..
- 每1小時(shí)40分鐘執(zhí)行一次(間隔時(shí)間為100分鐘)
使用三條cron表達(dá)式實(shí)現(xiàn)每100分鐘執(zhí)行一次。
第一條以01:40為起點(diǎn),執(zhí)行周期為5小時(shí)。
第二條以03:20為起點(diǎn),執(zhí)行周期為5小時(shí)。
第三條以05:00位起點(diǎn),執(zhí)行周期為5小時(shí)。
100 * 3=300=60 * 5
//每100分鐘執(zhí)行(01:40,03:20,05:00,06:40...)
"0 40 1/5 * * ?" //01:40,06:40,11:40..
"0 20 3/5 * * ?" //03:20,08:20,13:20..
"0 0 5/5 * * ?" //05:00,10:00,15:00..
(這里的cron表達(dá)式函數(shù)只會(huì)生成超過1小時(shí)且不超過1天間隔時(shí)間范圍的,1小時(shí)內(nèi)的需要另外判斷,比如說:我需要25分鐘執(zhí)行一次【cron表達(dá)式:(0 0/25 * * * ? )】,那執(zhí)行時(shí)間就為00:25,00:50,01:00,01:25,01:50… ,也就是說超出1小時(shí)的部分,就會(huì)從0再開始執(zhí)行周期而不是00:50的基礎(chǔ)上增加25分鐘,不會(huì)變成01:15那樣。所以這里的cron表達(dá)式只支持小時(shí)部分的自定義生成,不支持秒,分鐘,天,年…)
java語言寫的cron表達(dá)式生成函數(shù)(自定義小時(shí)部分):
- 【生成函數(shù)的原理在于:1.找到所有的起始時(shí)間,2.對應(yīng)的執(zhí)行周期,然后就可以拼接出cron表達(dá)式了。】不用規(guī)定結(jié)束時(shí)間的原因是,超出1天的部分,又會(huì)從0點(diǎn)0分開始重新按周期執(zhí)行,所以我們只需要(起始時(shí)間+間隔周期)就能得到所需cron表達(dá)式
//periodTime 間隔時(shí)間 單位:分鐘//返回列表形式的String類型數(shù)據(jù),將每一條cron表達(dá)式作為列表中的一項(xiàng)public List<String> createCron(Integer periodTime){List<String> cronList=new ArrayList<>();String cronStr = "* * * * * ?";int extraMin;//間隔時(shí)間大于1小時(shí)且不超過1天的情況if (periodTime>=60&&periodTime<=(60*24)){//間隔多少小時(shí)hour,以及額外多少分鐘minutesint hours=periodTime/60;int minutes=periodTime%60;if(hours>24||minutes>60){System.out.println("間隔時(shí)間超過1天");cronList.add(cronStr);return cronList;}if(minutes==0){//cron="0 0 0/2 * * ?" 從0小時(shí)開始,每2小時(shí)執(zhí)行一次cronStr="0 0 0/"+(periodTime/60)+" * * ?";cronList.add(cronStr);return cronList;}else{//開始int n=2;//當(dāng)間隔時(shí)間大于半天,一天無法執(zhí)行2次if((periodTime*n)>(24*60)){int phours=periodTime/60;int pMins=periodTime%60;//cron="0 30 12 * * ?" 每天的12點(diǎn)半執(zhí)行cronStr="0 "+pMins+" "+phours+" * * ?";cronList.add(cronStr);return cronList;}//找到倍數(shù)while((periodTime*n-periodTime)%60!=0&&((periodTime*n)<=(24*60))){System.out.println("間隔時(shí)間為:"+(periodTime*n));n++;}System.out.println("倍數(shù)為:"+n+" 目標(biāo)時(shí)間分鐘數(shù)為:"+(n*periodTime));//周期時(shí)間,每個(gè)相鄰時(shí)間點(diǎn)的間隔分鐘為periodTime,每個(gè)cron的周期時(shí)間為cycleTimeint cycleTime=(n-1)*periodTime;//確定周期for(int i=1;i<n;i++){//1個(gè)半小時(shí)// "0 30 1/3 * * ?" 1:30,4:30,7:30..// "0 0 0/3 * * ?" 0:00,3:00,6:00..int itemHour=(periodTime*i)/60;int itemMins=(periodTime*i)%60;if((itemHour-(cycleTime/60))==0)itemHour=0; //確保從0點(diǎn)開始String cronItem="0 "+itemMins+" "+itemHour+"/"+(cycleTime/60)+" * * ?";System.out.println("item的cron表達(dá)式是:"+cronItem);cronList.add(cronItem);}return cronList;}}//間隔小于1小時(shí)情況(這部分代碼不完整,需要自行仿照上面的小時(shí)判斷改寫,這里只是單純的在每小時(shí)內(nèi)保持了執(zhí)行周期)if(periodTime<60&&periodTime>0){//cron="0 0/1 * * * ?" 從0分鐘開始,每1分鐘執(zhí)行一次cronStr="0 0/"+periodTime+" * * * ?";cronList.add(cronStr);return cronList;}cronList.add(cronStr);return cronList;}
總結(jié)
以上是生活随笔為你收集整理的cron表达式生成函数(小时部分自定义) 1小时30分钟,1小时20分钟,1小时40分钟..的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。