JAVA将cron表达式转date类型时间

  • Post author:
  • Post category:java


最近工作中需要判断用户设置的CRON表达式的第一次执行时间是在什么时候,于是用到了CRON表达式对于DATE类型时间的转换,但是在网上找了一下,虽然找到了方法,但是由于没有仔细讲解,差点错过。

所以今天将那位老兄的代码改了改,准备加上点自己的理解,分享给大家。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.quartz.CronExpression;

public class CronDateUtil {
	public static List<String> parser(String cronExpression) { 
		List<String> result = new ArrayList<String>(); 
		if (cronExpression == null || cronExpression.length() < 1) { 
			return result; 
		} else { 
			CronExpression exp = null; 
			Calendar calendar = Calendar.getInstance(); 
			String cronDate = calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DATE); 
			String sStart = cronDate + " 00:00:00"; 
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
			Date dStart = null; 
			Date dEnd = null; 
			try { 
				exp = new CronExpression(cronExpression); 
				dStart = sdf.parse(sStart); 
				calendar.setTime(dStart); 
				calendar.add(Calendar.DATE, 1); 
				dEnd = calendar.getTime(); 
			} catch (ParseException e) {
				e.printStackTrace(); 
				return result; 
			} 
			Date dd = new Date(); 
			dd = exp.getNextValidTimeAfter(dd); 
			while (dd.getTime() < dEnd.getTime()) { 
				result.add(sdf.format(dd)); 
				dd = exp.getNextValidTimeAfter(dd); 
			} 
			exp = null; 
		} 
		return result; 
	}
	
	public static void main(String[] args) {
		String CRON_EXPRESSION = "0 15-30 13-13 ? * MON-FRI"; 
		System.out.println(CRON_EXPRESSION); 
		List<String> lTime = new ArrayList<String>(); 
		lTime = parser(CRON_EXPRESSION); 
		for (int i = 0; i < lTime.size(); i++) { 
			System.out.println(lTime.get(i)); 
		} 
	}
}

首先可以看到在进行cron表达式的非空判断后,我们定义了一个时间,这个时间是获取了当年当月当天之后与零点拼接在一起的,表示时间的查询是从当天零点开始;然后再try catch中我们调用了quartz包中的CronExpression类,可以看出他的作用是解析cron表达式中的各位置字符的含义。

然后便使用calendar方法获取了后一天零点时间,也可以说是当天的24点,这样把时间控制在了当天一整天,同时将两个时间转为date类型。

这时我们获取一个当前时间,然后调用CronExpression的getNextValidTimeAfter方法,获取的是当前时间点与表达式时间对比后的时间,只取当前时间之后的表达式中还会执行的时间。

比如现在是10点40,我们的cron表达式为”0 35-50 10-10 ? * MON-FRI” 每周一到周五的十点三十五到五十,每分钟一次,于是会输出四十以后的时间。

最后他会把整个时间集合存入到一个集合中输出;注意,如果集合为空,则证明当前时间已超过了cron表达式的执行时间。比如当前是周二,而我cron设置的是周三到周五,输出集合就为空;如果当前时间是十点四十,cron设置的时间是十点到十点半,那么输出的集合也为空。

当然我需要的是cron执行的第一个时间我就只需要定义一个当天零点时间,转为date类型,然后调用方法获取集合的第一个时间就OK了。

以上就是我在解决cron表达式转时间遇到的所有情况,记录每一个有意义的问题,大家共同成长,谢谢。



版权声明:本文为qq_37694421原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。