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