【动态任务-六】Spring对Cron表达式进行验证和计算时间

过往系列文章

使用的spring,maven

pom.xml

版本号

<spring.version>5.2.3.RELEASE</spring.version>

对应的依赖 

<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-websocket</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-expression</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-orm</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>

在Spring中提供了CronSequenceGenerator,以方便我们使用,

(ps:但在实际过程中,目前版本还是有点不太兼容,有些不能检验)

1.检验Cron表达式是否正确

CronSequenceGenerator提供了静态方法,我们直接调用就有,不需要new对象

//正确的
String cron1="0 0 10 * * ?";
System.out.println("cron1="+CronSequenceGenerator.isValidExpression(cron1));

//错误的
String cron2="0 0 10 * 123 ?";
System.out.println("cron2="+CronSequenceGenerator.isValidExpression(cron2));

运行结果

cron1=true
cron2=false

2.通过Cron计算下次运行时间点

CronSequenceGenerator计算,需要new一个新对象,构造函数用cron构建

String cron3="0 0 10 * * ?";//每天10点运行
CronSequenceGenerator csg = new CronSequenceGenerator(cron3);
System.out.println(DateUtils.formatDate(csg.next(now),"yyyy-MM-dd HH:mm:ss"));

运行结果

2020-10-24 10:00:00

 

3.修改一下整理成工具类

   /**
     * 获取下次时间点列表
     * @param cron 表达式
     * @param count 需要计算的数量
     * @return 返回日期集合
     */
    public static List<Date> calNextPoint(String cron,int count) {
    	return calNextPoint(cron,new Date(),count);
    }
    
    /**
     * 获取下次时间点列表
     * @param cron 表达式
     * @param date 当前日期
     * @param count 需要计算的数量
     * @return 返回日期集合
     */
    public static List<Date> calNextPoint(String cron,Date date,int count) {
    	List<Date> points=new ArrayList<>();
    	if(CronSequenceGenerator.isValidExpression(cron)) {
    		CronSequenceGenerator csg = new CronSequenceGenerator(cron);
        	Date nextDate=date;
        	for(int i=0;i<count;i++) {
        		nextDate=nextPoint(csg,nextDate);
        		points.add(nextDate);
        	}
    	}   	
    	return points;
    }
    
    /**
     *  计算下次时间点
     * @param csg
     * @param date
     * @return
     */
    public static Date nextPoint(CronSequenceGenerator csg,Date date) {   	
    	return csg.next(date);
    }

调用方法

Date now=new Date();
List<Date> points=calNextPoint("0 0 10 * * ?",now,5);
for(int i=0;i<points.size();i++) { 	 
    System.out.println(DateUtils.formatDate(points.get(i),"yyyy-MM-dd HH:mm:ss"));
}
System.out.println("-----");
List<Date> points2=calNextPoint("0 0 0/2 * * ?",now,6);
for(int i=0;i<points2.size();i++) { 		
    System.out.println(DateUtils.formatDate(points2.get(i),"yyyy-MM-dd HH:mm:ss"));
}

运行结果如下:

2020-10-24 10:00:00
2020-10-25 10:00:00
2020-10-26 10:00:00
2020-10-27 10:00:00
2020-10-28 10:00:00
-----
2020-10-24 00:00:00
2020-10-24 02:00:00
2020-10-24 04:00:00
2020-10-24 06:00:00
2020-10-24 08:00:00
2020-10-24 10:00:00

4.一般整合到项目

我们一般会在获取的页表数据进行处理,当然也可以存到数据库里,但是考虑到需要经常维护,我们使用了获取数据的时候计算

	public Page<Schedule> findByPage(Schedule schedule, Page<Schedule> page) {
		List<String> idList=dao.findIdsByPage(schedule, page);
		if(ObjectUtil.isNotEmpty(idList)) {
			List<Schedule> results=dao.getList(idList);
			Date now = new Date();
			for(Schedule dbSchedule:results) {
				List<Date> nextTimePoints=ScheduleKit.calNextPoint(dbSchedule.getCron(),now,3);
				dbSchedule.setNextTimePoints(nextTimePoints);
			}
			page.setResults(results);
		}
		return page;
	}

表现到页面的效果,仅做参考

然后这里结束,下篇会整理一下如何整合在线生成Cron表达式,敬请留意!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值