前段时间因为要做一个流式算法框架,其中时间判定部分使用了Cron表达式,顺便写了一个Cron的工具类,用于根据一个时间标签和Cron表达式来返回下一次满足Cron表达式的时间标签。
关于Cron表达式
关于什么是Cron表达式,以及Cron表达式的格式网上资料很多,比如下面两个:
Cron表达式
Cron表达式详细用法
解决的需求
1 根据传入的时间标签和Cron表达式,计算下一次满足Cron表达式的时间标签
2 用简单的时间、单位,生成简单的Cron表达式
public class CronExpressionResolver {
public static CronExpressionResolver getInstance(String cron) {
return new CronExpressionResolver(cron);
}
private CronExpressionResolver(String cron) {
this.cron = cron;
}
private String cron;
/**
* 获得下一个符合Cron表达式的时间
* @param time time
* @return next time
*/
public Date nextDateTime(Date time) {
CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
// currentTime为计算下次时间点的开始时间
return cronSequenceGenerator.next(time);
}
/**
* 获得下一个符合Cron表达式的时间
* @param time time
* @return next time
*/
public Date nextDateTime(long time) {
CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
// currentTime为计算下次时间点的开始时间
return cronSequenceGenerator.next(new Date(time));
}
/**
* 获得下一个符合Cron表达式的时间
* @param time time
* @return next time
*/
public long nextLongTime(Date time) {
CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
// currentTime为计算下次时间点的开始时间
return cronSequenceGenerator.next(time).getTime();
}
/**
* 获得下一个符合Cron表达式的时间
* @param time time
* @return next time
*/
public long nextLongTime(long time) {
CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
// currentTime为计算下次时间点的开始时间
return cronSequenceGenerator.next(new Date(time)).getTime();
}
/**
* 生成Cron表达式
*
* @param num 数值
* @param unit 单位:s-秒,m-分,h-小时,d-天,mon-月
* @return
*/
public static String timeToCron(int num, String unit) {
switch (unit){
case "s": return "0/" + num + " * * * * ?";
case "m": return "0 0/" + num + " * * * ?";
case "h": return "0 0 0/" + num + " * * ?";
case "d": return "0 0 0 1/" + num + " * ?";
case "mon": return "0 0 0 0 1/" + num + " ?";
default: return "";
}
}
}
网友评论