<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.0</version>
</dependency>
<!--解析cron表达式-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import org.quartz.CronExpression;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.stream.Collectors;
public class CronUtil {
public static String genCron(int type, String hour, String dayOfMon,
String month, String dayOfWeek,String everydayOther,String monthlyOther) {
String cron = "";
switch (type) {
case 0:
cron = "0 0 " + hour + " " + dayOfMon + " " + month + " ?";
break;
case 1:
cron = "0 0 " + hour + " " + dayOfMon + " * ?";
break;
case 2:
cron = "0 0 " + hour + " ? * " + dayOfWeek;
break;
case 3:
cron = "0 0 " + hour + " ? * *";
break;
case 4:
cron = "0 0 " + hour + " */" + everydayOther + " * ?";
break;
case 5:
cron = "0 0 " + hour + " " + dayOfMon + " "+ monthlyOther + " ?";
break;
}
return cron;
}
public static String genLinuxCron(int type, String hour, String dayOfMon,
String month, String dayOfWeek,String everydayOther,String monthlyOther,String weeklyOther) {
String cron = "";
switch (type) {
case 0:
cron = "00 " + hour + " " + dayOfMon + " " + month + " *";
break;
case 1:
cron = "00 " + hour + " " + dayOfMon + " * *";
break;
case 2:
cron = "00 " + hour + " * * " + getWeekly(dayOfWeek);
break;
case 3:
cron = "00 " + hour + " * * *";
break;
case 4:
cron = "00 " + hour + " */" + everydayOther + " * *";
break;
case 5:
cron = "00 " + hour + " " + dayOfMon + " "+ monthlyOther + " *";
break;
case 6:
cron = weeklyOther + " 00 " + hour + " * * " + getWeekly(dayOfWeek);
break;
}
return cron;
}
private static String getWeekly(String dayOfWeek){
String[] split = dayOfWeek.split(StrUtil.COMMA);
StringBuilder stringBuilder = new StringBuilder();
Arrays.stream(split)
.map(x -> stringBuilder.append(Integer.parseInt(x) - 1).append(StrUtil.COMMA)).collect(Collectors.toList());
return stringBuilder.substring(0,stringBuilder.length()-1);
}
private static String getMonthly(String monthlyOther,String startTime){
StringBuilder stringBuilder = new StringBuilder();
int num = Integer.parseInt(monthlyOther);
DateTime parse = DateUtil.parse(startTime);
int startMonth = parse.month()+1;
int month = parse.month()+1;
stringBuilder.append(month).append(StrUtil.COMMA);
for (int i = 0; ; i++) {
month=month+num;
if (month>12){
month=month-12;
if (month!=startMonth)stringBuilder.append(month).append(StrUtil.COMMA);
if (month>=startMonth)break;
month=month+12;
}
if (month<=12) stringBuilder.append(month).append(StrUtil.COMMA);
}
return stringBuilder.substring(0,stringBuilder.length()-1);
}
public static LinkedHashSet<String> getAllTheTimeInAYear(String cron,Date startTime){
LinkedHashSet<String> set = new LinkedHashSet<>();
try {
CronExpression exp = new CronExpression(cron);
Date oldTime = DateUtil.offsetMonth(startTime, -12).toJdkDate();
DateTime dateTime = DateUtil.offsetMonth(startTime, 12);
for (int i = 1;; i++) {
oldTime = exp.getNextValidTimeAfter(oldTime);
if (DateUtil.compare(oldTime,dateTime)>0) break;
if (DateUtil.compare(oldTime,startTime)>0 || DateUtil.compare(oldTime,startTime)==0)
set.add(DateUtil.format(oldTime,DateUtils.patternE));
}
} catch (ParseException e) {
return null;
}
return set;
}
public static LinkedHashSet<String> getAllTheTimeInAYearOfDay(Date startTime,String everydayOther){
LinkedHashSet<String> set = new LinkedHashSet<>();
if (DateUtil.compare(new Date(),startTime)<=0) set.add(DateUtil.format(startTime,DateUtils.patternE));
DateTime dateTime = DateUtil.offsetMonth(startTime, 12);
for (int i = 0; ; i++) {
startTime = DateUtil.offsetDay(startTime, Integer.parseInt(everydayOther));
if (DateUtil.compare(startTime,dateTime)>0) break;
set.add(DateUtil.format(startTime,DateUtils.patternE));
}
return set;
}
public static LinkedHashSet<String> getAllTheTimeInAYearOfWeekly(Date startTime,String weeklyOther,String weeklyDay){
LinkedHashSet<String> set = new LinkedHashSet<>();
HashSet<Integer> hashSet = new HashSet<>();
DateTime oldTime = DateUtil.offsetMonth(startTime, -12);
DateTime dateTime = DateUtil.offsetMonth(startTime, 12);
String[] split = weeklyDay.split(StrUtil.COMMA);
Arrays.stream(split).map(x->hashSet.add(Integer.parseInt(x))).collect(Collectors.toList());
Integer integer = hashSet.stream().min(Integer::compare).get();
for (int i = 0; ; i++) {
oldTime = DateUtil.offsetDay(oldTime, 1);
if (hashSet.contains(DateUtil.dayOfWeek(oldTime))){
if (DateUtil.compare(oldTime,dateTime)>0) break;
if (DateUtil.compare(oldTime,startTime)>=0) set.add(DateUtil.format(oldTime,DateUtils.patternE));
}
if (DateUtil.dayOfWeek(oldTime)== integer)
oldTime = DateUtil.offsetWeek(oldTime, Integer.parseInt(weeklyOther)-1);
}
return set;
}
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(111);
hashSet.add(21);
hashSet.add(13);
hashSet.add(12);
hashSet.add(16);
hashSet.add(31);
Integer integer = hashSet.stream().max(Integer::compare).get();
String[] split = "1,3,5,6".split(StrUtil.COMMA);
StringBuilder stringBuilder = new StringBuilder();
Arrays.stream(split).map(x -> stringBuilder.append(Integer.parseInt(x) - 1).append(StrUtil.COMMA)).collect(Collectors.toList());
Arrays.stream(split).map(x->hashSet.add(Integer.parseInt(x))).collect(Collectors.toList());
DateTime offsetWeek = DateUtil.offsetWeek(new Date(), 2);
int dayOfWeek = DateUtil.dayOfWeek(new Date());
System.out.println(getMonthly("2", "2020-03-25 14:00"));
String x = genCron(5, "10",
"1", "1", "1", "2", "2");
System.out.println(x);
try {
CronExpression exp = new CronExpression("0 0 2,4,5 2,25 */2 ? ");
Date date = new Date();
Date startDate = exp.getNextValidTimeAfter(date);
for (int i = 1;i<10; i++) {
startDate = exp.getNextValidTimeAfter(startDate);
System.out.println(DateUtil.format(startDate, DatePattern.NORM_DATETIME_PATTERN));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}