• 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());
            }
        }
    
  • 相关阅读:
    并发编程-process对象的其他属性方法
    Python json格式处理
    msf制作反弹shell
    Windows渗透备忘录
    WPF listbox实现多列显示数据
    Postgresql插入或更新操作upsert
    Windows 10 IoT Core Samples
    物联网平台开源
    实现领域驱动设计
    wpf Visibility 动画
  • 原文地址:https://www.cnblogs.com/ziyue7575/p/16293167.html
Copyright © 2020-2023  润新知