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

       最近工作中需要判断用户设置的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表达式转时间遇到的所有情况,记录每一个有意义的问题,大家共同成长,谢谢。

 

您可以使用一个名为"CronToExpression"的Java库将时间转换cron表达式。这个库支持所有cron表达式的特殊字符,包括 * / - ? LW #。您可以通过传入日期来获取相应的cron表达式。下面是一个示例代码: ```java import java.util.Date; public class Main { public static void main(String[] args) { Date date = new Date(); String cron = CronToExpression.getCron(date); System.out.println("当前时间 " + date.toString() + " 的表达式为 " + cron); } } ``` 这个示例将当前时间转换cron表达式。您可以根据您的需求更改日期参数来转换不同的时间。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [cron-parser:Cron表达式Java解析器](https://download.csdn.net/download/weixin_42131628/18342207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java根据指定时间cron表达式](https://blog.csdn.net/qq_43102730/article/details/125289153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值