/**
* 周
*/
public static final String[] weeks = {
"MON","TUE","WED","THU","FRI","SAT","SUN"};
/**
* 周
*/
public static final List<String> weekList = Arrays.asList(weeks);
/**
* 生成cron表达式
* @param min 分钟
* @param hour 时间
* @param day 日期
* @param week 周
* @return
*/
private static String createLoopCronExpression(Integer min,Integer hour,Integer day,String week){
String cron = "";
if(Objects.isNull(min) || Objects.isNull(hour)){
return cron;
}
String dayStr=null==day?"*":String.valueOf(day);
if(StringUtils.isNotEmpty(week)){
List<String> weeks = Arrays.asList(week.split(","));
if(weekList.containsAll(weeks)){
cron = "0 "+min+" "+hour+" ? * "+week;
}
}else {
cron = "0 "+min+" "+hour+" "+dayStr+" * ?";
}
return cron;
}
/**
* 创建每月循环cron表达式
* @param min
* @param hour
* @return
*/
public static String createLoopCronExpression(Integer min,Integer hour,Integer day){
return createLoopCronExpression(min,hour,day,null);
}
/**
* 创建每周循环cron表达式
* @param min
* @param hour
* @return
*/
public static String createLoopCronExpression(Integer min,Integer hour,String week){
return createLoopCronExpression(min,hour,null,week);
}
/**
* 创建每日循环cron表达式
* @param min
* @param hour
* @return
*/
public static String createLoopCronExpression(Integer min,Integer hour){
return createLoopCronExpression(min,hour,null,null);
}
/**
* 返回corn表达式下一次执行的时间
* @param cron
* @return
*/
public static LocalDateTime cornToDate(String cron){
return cornToDate(LocalDateTime.now(),cron);
}
public static LocalDateTime cornToDate(LocalDateTime now,String cron){
CronSequenceGenerator g = new CronSequenceGenerator(cron);
Date d = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
d = g.next(d);
LocalDateTime dateTime = d.toInstant().atZone(ZoneId.systemDefault())
.toLocalDateTime();
return dateTime;
}
/**
* 获取每月重复下一次的正确时间
* @param now
* @param next
* @return
*/
public static LocalDateTime getNextDateOfCorn(LocalDateTime now,LocalDateTime next){
Integer daySub = LocalDateTImeUtil.getDaySub(now,next);
if(daySub>31){
next = next.withMonth(next.getMonthValue()-1).with(TemporalAdjusters.lastDayOfMonth());
}
return next;
}
public static void main(String[] args) {
//String cron = "0 18 9 ? * MON,TUE";
//Arrays.asList(cron.split(" ")[5].split(",")).forEach(System.out::println);
String cron = createLoopCronExpression(0,9,29,null);
LocalDateTime now = LocalDateTime.now();
LocalDateTime next;
int size = 10;
List<String> res = new ArrayList<>(size);
CronSequenceGenerator g = new CronSequenceGenerator(cron);
Date d = new Date();
for (int i = 0; i < size; i++) {
next = g.next(d).toInstant().atZone(ZoneId.systemDefault())
.toLocalDateTime();
next = getNextDateOfCorn(now,next);
res.add(next.toString());
now = next;
d = Date.from(next.atZone(ZoneId.systemDefault()).toInstant());
}
res.forEach(System.out::println);
//String cron = createLoopCronExpression(0,9,null,null);
//String cron = createLoopCronExpression(49,18);
//String cron = createLoopCronExpression(49,18,"MON");
//String cron = createLoopCronExpression(0,9,31);
/*System.out.println(cron);
LocalDateTime dateTime = cornToDate(cron);
System.out.println(dateTime);
System.out.println("day:"+dateTime.getDayOfMonth());
System.out.println("week:"+weekList.get(dateTime.getDayOfWeek().getValue()-1));
System.out.println("hour:"+dateTime.getHour());
System.out.println("min:"+dateTime.getMinute());*/
/*int size = 10;
CronSequenceGenerator g = new CronSequenceGenerator(cron);
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<String> res = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
d = g.next(d);
res.add(sdf.format(d));
}
res.forEach(System.out::println);*/
}
生成每日每周每月的corn表达式
猜你喜欢
转载自blog.csdn.net/linyiwwy/article/details/124282136
今日推荐
周排行