Java解析cron表达式实战

目录

    • 前言
    • 实战
      • 依赖
      • code
      • 执行结果

前言

   前面讲了CentOS中安装crontab以及cron表达式的规则说明,在实际开发中我们经常会用到,有时候我们懒得记规则的时候,我们就会用一些工具网站去解析,例如我常用的:https://www.bejson.com/othertools/cron/
   在我们实际开发中多数会在一些定时任务中试用表达式来控制任务的执行时间、频率等。有时候在围绕任务调度进行开发的时候,是需要通过解析表达式来获取一些信息,例如需要获取表达式得下一次执行时间,或者让用户在界面上设置时间,我们来生成cron表达式。那么如何来实现这些需求,这里我推荐cron-utils.

实战

直接看代码

依赖

  		<dependency>
            <groupId>com.cronutilsgroupId>
            <artifactId>cron-utilsartifactId>
            <version>9.2.0version>
        dependency>

code

解释见代码中注释

package com.cn.scott.test;

import com.cronutils.builder.CronBuilder;
import com.cronutils.descriptor.CronDescriptor;
import com.cronutils.model.Cron;
import com.cronutils.model.CronType;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.model.field.value.SpecialChar;
import com.cronutils.model.time.ExecutionTime;
import com.cronutils.parser.CronParser;

import java.time.ZonedDateTime;
import java.util.Locale;
import java.util.Optional;

import static com.cronutils.model.CronType.QUARTZ;
import static com.cronutils.model.field.expression.FieldExpressionFactory.*;

public class CronParseTest {


    public static void main(String[] args) {

        CronParser parser = new CronParser(buildCronDefinition());
        ZonedDateTime now = ZonedDateTime.now();
        ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("14 13 12 * * ? "));
        Optional<ZonedDateTime> lastExecution = executionTime.lastExecution(now);

        // 获取下一次执行日期
        Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(now);
        System.out.println("【14 13 12 * * ? 】表达式下一次执行时间"+nextExecution.get().toLocalDateTime().toString());


        // 创建表达式解释器
        CronDescriptor descriptor = CronDescriptor.instance(Locale.CHINESE);

        // 获取对应表达式解释
        String description = descriptor.describe(parser.parse("*/45 * * * * ?"));
        System.out.println("【*/45 * * * * ?】表达式解释为:"+description);

        // 获取对应表达式解释
        String describe = descriptor.describe(parser.parse("0 23 * ? * MON-FRI *"));
        System.out.println("【0 23 * ? * MON-FRI * 】表达式解释为:"+describe);

        //表达式构建
        String cron = buildCron();
        System.out.println("生成表达式:"+cron);
    }


    public static String buildCron(){
        //构建表达式,条件可以自己填写
        Cron cron = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ))
                .withYear(always())
                .withDoM(between(SpecialChar.L, 3))
                .withMonth(always())
                .withDoW(questionMark())
                .withHour(always())
                .withMinute(on(15))
                .withSecond(on(0))
                .instance();
        String cronAsString = cron.asString();
        return cronAsString;
    }


    public static CronDefinition buildCronDefinition(){
        CronDefinition cronDefinition = CronDefinitionBuilder.defineCron()
                        .withSeconds().and()
                        .withMinutes().and()
                        .withHours().and()
                        .withDayOfMonth()
                        .supportsHash().supportsL().supportsW().and()
                        .withMonth().and()
                        .withDayOfWeek()
                        .withIntMapping(7, 0) //we support non-standard non-zero-based numbers!
                        .supportsHash().supportsL().supportsW().and()
                        .withYear().optional().and()
                        .instance();
        cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
        return cronDefinition;
    }


}

执行结果

【14 13 12 * * ? 】表达式下一次执行时间2023-03-29T12:13:14
【*/45 * * * * ?】表达式解释为:每 45 秒
【0 23 * ? * MON-FRI * 】表达式解释为:每 小时 在 分钟 23 每 天 在星期一和星期五之间
 生成表达式:0 15 * L-3 * ? *

点赞收藏,富婆包养✋✋

你可能感兴趣的:(java,java,jvm,开发语言,cron)