【轉】根據cron表達式獲取最近幾次執行的時間


根據cron表達式獲取最近幾次執行的時間
最近有個新需求,就是現在有個定時任務,前端需要展示出最近一次的具體執行時間:

具體可有以下兩種做法(可能更多),個人推薦方式一
方式一:指定獲取的最近執行的次數
首先maven引入依賴(本來就有定時任務的,此步驟僅又來做個人測試)

<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
 </dependency>

 

直接貼上method

/**
 *
 * @param cronExpression    cron表達式
 * @param numTimes    下一(幾)次運行的時間
 * @return
 */
public static List<String> getNextExecTime(String cronExpression,Integer numTimes) {
        List<String> list = new ArrayList<>();
        CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
        try {
            cronTriggerImpl.setCronExpression(cronExpression);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        // 這個是重點,一行代碼搞定
        List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (Date date : dates) {
            list.add(dateFormat.format(date));
        }
        return list;
    }

  


方式二:獲取指定時間內(可以自己指定年或月或日)所有的執行時間,然后在所有的時間內取前幾個(不推薦,當觸發時間過短,程序響應時間非常長)
廢話不多說,直接上method

   /**
     * @param cronExpression cron表達式
     * @param numTimes       下一(幾)次運行的時間
     * @return
     */
    public static List<String> getRecentExecTime(String cronExpression, Integer numTimes) {
        List<String> list = new ArrayList<>();
        try {
            CronTriggerImpl cronTrigger = new CronTriggerImpl();
            cronTrigger.setCronExpression(cronExpression);
            // 這里寫要准備猜測的cron表達式
            Calendar calendar = Calendar.getInstance();
            Date now = calendar.getTime();
            // 把統計的區間段設置為從現在到2年后的今天(主要是為了方法通用考慮,如那些1個月跑一次的任務,如果時間段設置的較短就不足20條)
            calendar.add(Calendar.YEAR, 2);
            // 這個是重點,一行代碼搞定
            List<Date> dates = TriggerUtils.computeFireTimesBetween(cronTrigger, null, now, calendar.getTime());
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            for(int i = 0; i < dates.size(); i++) {
                // 這個是提示的日期個數
                if(i < numTimes) {
                    list.add(dateFormat.format(dates.get(i)));
                }else {
                    break;
                }
            }

        } catch(ParseException e) {
            e.printStackTrace();
        }
        return list;
    }

  

轉自:https://blog.csdn.net/macro_g/article/details/81668409

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM