`
kanpiaoxue
  • 浏览: 1781788 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

quartz.CronExpression计算未来执行时间

 
阅读更多

 

 

import org.joda.time.DateTime;
import org.quartz.CronExpression;

import com.google.common.collect.Lists;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * CronExpressionUtils.java
 * 
 * @author kanpiaoxue
 * @version 1.0
 *          Create Time 2018年11月18日 下午10:15:41
 *          Description : spring的cron表达式工具类
 */
public class CronExpressionUtils {
    /**
     * 计算在[startDate,endDate]区间之间满足crontab表达式的时间列表
     * 
     * @param crontab
     *            :spring cronExpression
     * @param startDate
     *            :左闭区间
     * @param endDate
     *            : 右闭区间
     * @return 在[startDate,endDate]区间之间满足crontab表达式的时间列表
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static List<Date> getMatchedTimes(String crontab, Date startDate, Date endDate) {
        try {
            CronExpression cronExpression = new CronExpression(crontab);
            List<Date> matchedTimes = Lists.newArrayList();
            Date beginTime = new DateTime(startDate).plusMillis(-1).toDate();
            Date currentDate = cronExpression.getNextValidTimeAfter(beginTime);
            while (!currentDate.after(endDate)) {
                matchedTimes.add(currentDate);
                currentDate = cronExpression.getNextValidTimeAfter(currentDate);
            }
            return matchedTimes;
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid crontab " + crontab, e);
        }
    }

    /**
     * 计算startDate时间后符合crontab表达式的时间
     * 
     * @param crontab
     *            : spring cronExpression
     * @param startDate
     *            : 开始时间
     * @return startDate时间后符合crontab表达式的时间
     * @throws ParseException
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static Date getNext(String crontab, Date startDate) {
        try {
            CronExpression cronExpression = new CronExpression(crontab);
            return cronExpression.getNextValidTimeAfter(startDate);
        } catch (ParseException e) {
            throw new IllegalArgumentException("invalid crontab " + crontab, e);
        }
    }

    /**
     * 判断cronExpression是否是个有效的表达式
     * 
     * @param crontab
     *            : spring cronExpression
     * @return cronExpression是否是个有效的表达式
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午10:15:52
     *         Description :
     */
    public static boolean isValidExpression(String crontab) {
        return CronExpression.isValidExpression(crontab);
    }
}

 

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.google.common.base.Preconditions;

/**
 * DateUtils.java
 *
 * @author kanpiaoxue
 * @version 1.0
 *          Create Time 2018年11月18日 下午4:31:33
 *          Description : 时间工具类
 */
public class DateUtils {

    public static final DateTimeFormatter yyyy_MM_dd = DateTimeFormat.forPattern("yyyy-MM-dd");
    public static final DateTimeFormatter yyyy_MM_dd_HH_mm_ss = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    public static final DateTimeFormatter yyyy_MM_dd_HH_mm_ss_SSS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");

    /**
     * @param dateTime
     * @return
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午4:41:42
     *         Description : 修正当前时间为日期的零点时间,如:2018-11-18 23:59:59.999
     */
    public static DateTime correctDayEndTime(DateTime dateTime) {
        Preconditions.checkNotNull(dateTime, "dateTime is null");
        DateTime rs = new DateTime(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth(),
                23, 59, 59, 999);
        return rs;
    }

    /**
     * @param dateTime
     * @return
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午4:41:45
     *         Description : 修正当前时间为日期的零点时间,如:2018-11-18 00:00:00.000
     */
    public static DateTime correctDayStartTime(DateTime dateTime) {
        Preconditions.checkNotNull(dateTime, "dateTime is null");
        DateTime rs = new DateTime(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth(), 0,
                0, 0, 0);
        return rs;
    }

    /**
     * @return 明天的时间
     * @author kanpiaoxue
     *         Create Time 2018年11月18日 下午5:24:56
     *         Description : 得到明天的时间
     */
    public static DateTime getTomorrow() {
        return DateTime.now().dayOfMonth().addToCopy(1);
    }

    private DateUtils() {
        super();
    }
}

 

 

    public static void main(String[] args) throws Exception {
        DateTime now = DateTime.now();
        DateTime startDate = DateUtils.correctDayStartTime(now);
        DateTime endDate = DateUtils.correctDayEndTime(now);
        // 每天,间隔5分钟运行一次
        List<Date> dates =
                CronExpressionUtils.getMatchedTimes("0 0/5 * * * ?", startDate.toDate(), endDate.toDate());

        System.out.println(dates.size());
        System.out.println("startDate:" + startDate.toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        System.out.println("endDate:" + endDate.toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        dates.stream().forEach(date -> {
            System.out.println(new DateTime(date).toString(DateUtils.yyyy_MM_dd_HH_mm_ss));
        });
    }

 

 

 

 

output:

 

288

startDate:2018-11-18 00:00:00

endDate:2018-11-18 23:59:59

2018-11-18 00:00:00

2018-11-18 00:05:00

2018-11-18 00:10:00

2018-11-18 00:15:00

2018-11-18 00:20:00

2018-11-18 00:25:00

2018-11-18 00:30:00

2018-11-18 00:35:00

2018-11-18 00:40:00

2018-11-18 00:45:00

2018-11-18 00:50:00

2018-11-18 00:55:00

2018-11-18 01:00:00

2018-11-18 01:05:00

2018-11-18 01:10:00

2018-11-18 01:15:00

2018-11-18 01:20:00

2018-11-18 01:25:00

2018-11-18 01:30:00

2018-11-18 01:35:00

2018-11-18 01:40:00

2018-11-18 01:45:00

2018-11-18 01:50:00

2018-11-18 01:55:00

2018-11-18 02:00:00

2018-11-18 02:05:00

2018-11-18 02:10:00

2018-11-18 02:15:00

2018-11-18 02:20:00

2018-11-18 02:25:00

2018-11-18 02:30:00

2018-11-18 02:35:00

2018-11-18 02:40:00

2018-11-18 02:45:00

2018-11-18 02:50:00

2018-11-18 02:55:00

2018-11-18 03:00:00

2018-11-18 03:05:00

2018-11-18 03:10:00

2018-11-18 03:15:00

2018-11-18 03:20:00

2018-11-18 03:25:00

2018-11-18 03:30:00

2018-11-18 03:35:00

2018-11-18 03:40:00

2018-11-18 03:45:00

2018-11-18 03:50:00

2018-11-18 03:55:00

2018-11-18 04:00:00

2018-11-18 04:05:00

2018-11-18 04:10:00

2018-11-18 04:15:00

2018-11-18 04:20:00

2018-11-18 04:25:00

2018-11-18 04:30:00

2018-11-18 04:35:00

2018-11-18 04:40:00

2018-11-18 04:45:00

2018-11-18 04:50:00

2018-11-18 04:55:00

2018-11-18 05:00:00

2018-11-18 05:05:00

2018-11-18 05:10:00

2018-11-18 05:15:00

2018-11-18 05:20:00

2018-11-18 05:25:00

2018-11-18 05:30:00

2018-11-18 05:35:00

2018-11-18 05:40:00

2018-11-18 05:45:00

2018-11-18 05:50:00

2018-11-18 05:55:00

2018-11-18 06:00:00

2018-11-18 06:05:00

2018-11-18 06:10:00

2018-11-18 06:15:00

2018-11-18 06:20:00

2018-11-18 06:25:00

2018-11-18 06:30:00

2018-11-18 06:35:00

2018-11-18 06:40:00

2018-11-18 06:45:00

2018-11-18 06:50:00

2018-11-18 06:55:00

2018-11-18 07:00:00

2018-11-18 07:05:00

2018-11-18 07:10:00

2018-11-18 07:15:00

2018-11-18 07:20:00

2018-11-18 07:25:00

2018-11-18 07:30:00

2018-11-18 07:35:00

2018-11-18 07:40:00

2018-11-18 07:45:00

2018-11-18 07:50:00

2018-11-18 07:55:00

2018-11-18 08:00:00

2018-11-18 08:05:00

2018-11-18 08:10:00

2018-11-18 08:15:00

2018-11-18 08:20:00

2018-11-18 08:25:00

2018-11-18 08:30:00

2018-11-18 08:35:00

2018-11-18 08:40:00

2018-11-18 08:45:00

2018-11-18 08:50:00

2018-11-18 08:55:00

2018-11-18 09:00:00

2018-11-18 09:05:00

2018-11-18 09:10:00

2018-11-18 09:15:00

2018-11-18 09:20:00

2018-11-18 09:25:00

2018-11-18 09:30:00

2018-11-18 09:35:00

2018-11-18 09:40:00

2018-11-18 09:45:00

2018-11-18 09:50:00

2018-11-18 09:55:00

2018-11-18 10:00:00

2018-11-18 10:05:00

2018-11-18 10:10:00

2018-11-18 10:15:00

2018-11-18 10:20:00

2018-11-18 10:25:00

2018-11-18 10:30:00

2018-11-18 10:35:00

2018-11-18 10:40:00

2018-11-18 10:45:00

2018-11-18 10:50:00

2018-11-18 10:55:00

2018-11-18 11:00:00

2018-11-18 11:05:00

2018-11-18 11:10:00

2018-11-18 11:15:00

2018-11-18 11:20:00

2018-11-18 11:25:00

2018-11-18 11:30:00

2018-11-18 11:35:00

2018-11-18 11:40:00

2018-11-18 11:45:00

2018-11-18 11:50:00

2018-11-18 11:55:00

2018-11-18 12:00:00

2018-11-18 12:05:00

2018-11-18 12:10:00

2018-11-18 12:15:00

2018-11-18 12:20:00

2018-11-18 12:25:00

2018-11-18 12:30:00

2018-11-18 12:35:00

2018-11-18 12:40:00

2018-11-18 12:45:00

2018-11-18 12:50:00

2018-11-18 12:55:00

2018-11-18 13:00:00

2018-11-18 13:05:00

2018-11-18 13:10:00

2018-11-18 13:15:00

2018-11-18 13:20:00

2018-11-18 13:25:00

2018-11-18 13:30:00

2018-11-18 13:35:00

2018-11-18 13:40:00

2018-11-18 13:45:00

2018-11-18 13:50:00

2018-11-18 13:55:00

2018-11-18 14:00:00

2018-11-18 14:05:00

2018-11-18 14:10:00

2018-11-18 14:15:00

2018-11-18 14:20:00

2018-11-18 14:25:00

2018-11-18 14:30:00

2018-11-18 14:35:00

2018-11-18 14:40:00

2018-11-18 14:45:00

2018-11-18 14:50:00

2018-11-18 14:55:00

2018-11-18 15:00:00

2018-11-18 15:05:00

2018-11-18 15:10:00

2018-11-18 15:15:00

2018-11-18 15:20:00

2018-11-18 15:25:00

2018-11-18 15:30:00

2018-11-18 15:35:00

2018-11-18 15:40:00

2018-11-18 15:45:00

2018-11-18 15:50:00

2018-11-18 15:55:00

2018-11-18 16:00:00

2018-11-18 16:05:00

2018-11-18 16:10:00

2018-11-18 16:15:00

2018-11-18 16:20:00

2018-11-18 16:25:00

2018-11-18 16:30:00

2018-11-18 16:35:00

2018-11-18 16:40:00

2018-11-18 16:45:00

2018-11-18 16:50:00

2018-11-18 16:55:00

2018-11-18 17:00:00

2018-11-18 17:05:00

2018-11-18 17:10:00

2018-11-18 17:15:00

2018-11-18 17:20:00

2018-11-18 17:25:00

2018-11-18 17:30:00

2018-11-18 17:35:00

2018-11-18 17:40:00

2018-11-18 17:45:00

2018-11-18 17:50:00

2018-11-18 17:55:00

2018-11-18 18:00:00

2018-11-18 18:05:00

2018-11-18 18:10:00

2018-11-18 18:15:00

2018-11-18 18:20:00

2018-11-18 18:25:00

2018-11-18 18:30:00

2018-11-18 18:35:00

2018-11-18 18:40:00

2018-11-18 18:45:00

2018-11-18 18:50:00

2018-11-18 18:55:00

2018-11-18 19:00:00

2018-11-18 19:05:00

2018-11-18 19:10:00

2018-11-18 19:15:00

2018-11-18 19:20:00

2018-11-18 19:25:00

2018-11-18 19:30:00

2018-11-18 19:35:00

2018-11-18 19:40:00

2018-11-18 19:45:00

2018-11-18 19:50:00

2018-11-18 19:55:00

2018-11-18 20:00:00

2018-11-18 20:05:00

2018-11-18 20:10:00

2018-11-18 20:15:00

2018-11-18 20:20:00

2018-11-18 20:25:00

2018-11-18 20:30:00

2018-11-18 20:35:00

2018-11-18 20:40:00

2018-11-18 20:45:00

2018-11-18 20:50:00

2018-11-18 20:55:00

2018-11-18 21:00:00

2018-11-18 21:05:00

2018-11-18 21:10:00

2018-11-18 21:15:00

2018-11-18 21:20:00

2018-11-18 21:25:00

2018-11-18 21:30:00

2018-11-18 21:35:00

2018-11-18 21:40:00

2018-11-18 21:45:00

2018-11-18 21:50:00

2018-11-18 21:55:00

2018-11-18 22:00:00

2018-11-18 22:05:00

2018-11-18 22:10:00

2018-11-18 22:15:00

2018-11-18 22:20:00

2018-11-18 22:25:00

2018-11-18 22:30:00

2018-11-18 22:35:00

2018-11-18 22:40:00

2018-11-18 22:45:00

2018-11-18 22:50:00

2018-11-18 22:55:00

2018-11-18 23:00:00

2018-11-18 23:05:00

2018-11-18 23:10:00

2018-11-18 23:15:00

2018-11-18 23:20:00

2018-11-18 23:25:00

2018-11-18 23:30:00

2018-11-18 23:35:00

2018-11-18 23:40:00

2018-11-18 23:45:00

2018-11-18 23:50:00

2018-11-18 23:55:00

 

分享到:
评论

相关推荐

    Quartz在Spring中动态设置cronExpression

    动态更新`CronExpression`的能力对于那些需要根据业务需求实时调整任务执行时间的应用程序来说至关重要。例如,如果一个应用程序需要根据用户的行为或外部数据源的变化来调整任务执行的频率,那么能够动态更改Cron...

    quartz.jar包下载

    Quartz.jar是一个非常重要的Java库,它主要用于计划和执行任务,特别是在企业级应用程序中。这个包包含了一系列的类和接口,使得开发者能够方便地创建、调度和管理定时任务。Quartz的核心是基于Cron表达式的,它允许...

    quartz cronExpression配置说明

    对于开发和调试cronExpression,可以使用在线工具如CronMaker或直接在Quartz的源码中查看`org.quartz.CronExpression`类,它提供了对cron表达式的解析和验证功能。 总结来说,`quartz cronExpression`是Quartz框架...

    Spring线程时间配置:Quartz和CronExpression

    它支持触发器、作业、日历等功能,并且能够根据复杂的Cron表达式来定义作业的执行时间。本文将详细介绍如何在Spring中配置Quartz以及CronExpression的使用方法。 #### 一、Cron表达式的结构与解析 Cron表达式是一...

    Quartz之CronExpression详解

    通过这种格式化的字符串,用户能够灵活地定义任务执行的时间规律。CronExpression由六个或七个字段组成,各字段之间用空格分隔,具体包括秒、分、小时、日、月、周几以及可选的年份字段。 #### 二、CronExpression...

    quartz.rar

    接下来,我们需要创建一个`Job`类,这个类需要实现`org.quartz.Job`接口,并重写`execute`方法。在这个方法中,我们可以编写需要定时执行的任务代码。例如: ```java import org.quartz.Job; import org.quartz....

    quartz 随tomcat启动执行一次

    Quartz 是一个开源的作业调度框架,能够触发在指定时间执行的任务(也称为作业)。它提供了丰富的调度器功能,如支持复杂的循环调度、支持并发控制等。Quartz 可以被应用在任何 Java 应用中,但大多数情况下,它被...

    quartz.zip

    - **CronExpression**: Cron表达式用于创建基于时间的触发器,如每天的特定时间执行任务。 2. **Quartz配置**: - **quartz.properties**: 这个文件是Quartz的主要配置文件,包含了数据库连接信息、Job存储方式、...

    SpringBoot-Quartz.rar

    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool # threadCount和threadPriority将以setter的形式注入ThreadPool实例 # 并发个数 org.quartz.threadPool.threadCount = 5 # 优先级 org.quartz....

    postgres-quartz.sql

    postgres quatrz初始化sql...#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate

    spring定时任务quartz.jar

    这通常包括`SchedulerFactoryBean`,它负责创建和管理Quartz的`Scheduler`实例,以及`JobDetail`和`Trigger`,分别定义了任务内容和执行时间。例如: ```xml &lt;bean id="schedulerFactoryBean" class="org.spring...

    quartz.properties

    quartz.properties

    springboot-quartz.zip

    quartz.dataSource.quartzDataSource.jdbcUrl=jdbc:mysql://localhost:3306/quartz_db quartz.dataSource.quartzDataSource.user=root quartz.dataSource.quartzDataSource.password=password quartz.overwrite-...

    regsvr32 quartz.dll

    电脑系统文件,下载解压放置相应位置即可!regsvr32 quartz.dll和Proppage.dll和directSpy.dll.7z

    quartz.dll Proppage.dll和directSpy.dll

    quartz.dll文件 Proppage.dll文件和directSpy.dll 用于某些摄像头安装好后依然显示该设备正在使用,放到系统System32目录下并在运行中用regsvr32命令依次注册即可。

    quartz.jar

    1. **灵活的调度**:Quartz提供了丰富的调度API,可以精确到秒级别来设定任务的执行时间,甚至可以设置复杂的调度规则,如每隔一段时间执行一次,或者在特定日期和时间执行。 2. **可持久化**:Quartz支持将任务和...

    common-quartz.zip

    在实际应用中,你可能需要根据业务需求调整触发策略,比如使用CRON表达式控制任务的执行时间,或者动态管理任务的生命周期。此外,如果你需要在数据库中存储任务信息,还需要配置Quartz的数据源,并确保相关的表结构...

    spring java 定时器 执行两次 quartz

    接下来,创建一个Trigger来指定任务的执行时间。你可以使用`CronTrigger`或者`SimpleTrigger`,取决于你的需求: ```java &lt;bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt; ...

    定时调用 Quartz.jar,实现定时调用

    它提供了高度可配置的调度服务,允许开发者精确控制任务的执行时间。以下是对使用Quartz.jar实现定时调用的详细说明: 1. **环境准备**: 在开始使用Quartz之前,你需要将Quartz的jar包添加到项目的类路径中。这...

Global site tag (gtag.js) - Google Analytics