java对cron计算处理

注意:xxljob的cron大部分和SpringBoot的是一样的,但是在周的处理上有点不同
xxljob:【1,7】代表【周日,周六】
SpringBoot:【1,7】代表【周一,周日】
所以xxljob的执行时间和不能直接用SpringBoot的工具类处理(目前发现只有周会这样,不是按周处理的话不要紧)

quartz

需要依赖

<!-- 依赖quartz -->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
  <exclusions>
    <exclusion>
      <artifactId>slf4j-api</artifactId>
      <groupId>org.slf4j</groupId>
    </exclusion>
  </exclusions>
</dependency>

cron是否正确校验

CronExpression.isValidExpression(cron)
返回Boolean格式

xxljob工具类

码云地址

cron是否正确校验

CronExpression.isValidExpression(cron)

下次执行时间

CronExpression expression = new CronExpression(cron);
Date nextTime = expression.getNextInvalidTimeAfter(new Date()); //这个时间之后的第一次执行时间

SpringBoot工具类

CronSequenceGenerator

cron是否正确校验

CronSequenceGenerator.isValidExpression(cron)

下次执行时间

CronSequenceGenerator expression = new CronSequenceGenerator(cron);
Date nextTime = expression.next(new Date()); //这个时间之后的第一次执行时间

cron-utils

可以处理spring和quartz

        <dependency>
            <groupId>com.cronutils</groupId>
            <artifactId>cron-utils</artifactId>
            <version>9.1.6</version>
        </dependency>

自定义工具类

   /**
     * cron的表达式 秒 分 时 日 月 周
     */
    public static String cronModel = "%s %s %s %s %s %s";

    public static ExecutionTime getExecutionTime(String cron) {
        CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
        CronParser parser = new CronParser(cronDefinition);
        return ExecutionTime.forCron(parser.parse(cron));
    }

    /**
     * 给定的时间是否在cron表达式之中
     */
    public static boolean isRunDate(ExecutionTime executionTime, Date date) {
        return executionTime.isMatch(dateToZonedDateTime(date));
    }

    /**
     * 获取下次执行时间,若是当前时间合适,返回这个时间
     * @param cron
     * @param date
     * @return
     */
    public static Date getNowOrNextDate(ExecutionTime executionTime, Date date) {
        if (isRunDate(executionTime, date)) {
            return date;
        } else {
            return getNextDate(executionTime, date);
        }
    }

    /**
     * 获取这个时间之后的下次执行时间
     * @param cron
     * @param date
     * @return
     */
    public static Date getNextDate(ExecutionTime executionTime, Date date) {
        ZonedDateTime time = executionTime.nextExecution(dateToZonedDateTime(date)).orElse(null);
        return zonedDateTimeToDate(time);
    }

    /**
     * 或者这个时间之前的上次执行时间
     * @param cron
     * @param date
     * @return
     */
    public static Date getLastRunDate(ExecutionTime executionTime, Date date) {
        ZonedDateTime time = executionTime.lastExecution(dateToZonedDateTime(date)).orElse(null);
        return zonedDateTimeToDate(time);
    }
    /**
     * 将ZonedDateTime转date
     * @param date
     * @return
     */
    public static Date zonedDateTimeToDate(ZonedDateTime time) {
        if (time == null) {
            return null;
        } else {
            return Date.from(time.toInstant());
        }
    }
posted @ 2022-05-20 17:32  紫月java  阅读(435)  评论(0编辑  收藏  举报