Java解析cron表达式实战

前言

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

实战

直接看代码👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

依赖

  		<dependency>
            <groupId>com.cronutils</groupId>
            <artifactId>cron-utils</artifactId>
            <version>9.2.0</version>
        </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 * ? *

点赞收藏,富婆包养✋✋

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java中有一些库可以用来解析cron表达式,其中一个常用的库是cron-utils。使用cron-utils可以将cron表达式转换为人类可读的字符串,并且支持解析cron表达式的各种特殊字符。 以下是使用cron-utils解析cron表达式的示例代码: ```java import com.cronutils.model.Cron; import com.cronutils.model.definition.CronDefinition; import com.cronutils.model.definition.CronDefinitionBuilder; import com.cronutils.parser.CronParser; public class CronParserExample { public static void main(String[] args) { // 定义cron表达式的格式 CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronDefinitionBuilder.instanceDefinitionForQuartzV2()); // 创建CronParser对象 CronParser parser = new CronParser(cronDefinition); try { // 解析cron表达式 Cron cron = parser.parse("0 0 12 * * ?"); // 获取解析后的cron表达式的各个字段值 String minutes = cron.retrieve(CronFieldName.MINUTE).getExpression().asString(); String hours = cron.retrieve(CronFieldName.HOUR).getExpression().asString(); String dayOfMonth = cron.retrieve(CronFieldName.DAY_OF_MONTH).getExpression().asString(); String month = cron.retrieve(CronFieldName.MONTH).getExpression().asString(); String dayOfWeek = cron.retrieve(CronFieldName.DAY_OF_WEEK).getExpression().asString(); String year = cron.retrieve(CronFieldName.YEAR).getExpression().asString(); // 输出解析结果 System.out.println("Minutes: " + minutes); System.out.println("Hours: " + hours); System.out.println("Day of Month: " + dayOfMonth); System.out.println("Month: " + month); System.out.println("Day of Week: " + dayOfWeek); System.out.println("Year: " + year); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码中,我们首先定义了cron表达式的格式,然后创建了一个CronParser对象,并使用该对象解析了一个cron表达式。接着,我们通过Cron对象的retrieve方法获取了解析后的cron表达式的各个字段值,并将其输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码大师麦克劳瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值