1、使用说明
序号 说明 是否必填 允许填的值 允许通配符
1 秒 是 0~59 , - * /
2 分 是 0~59 , - * /
3 时 是 0~23 , - * /
4 日 是 1~31 , - * ? / L W
5 月 是 1-12或JAN-DEC , - * /
6 周 是 1-7或SUN-SAT , - * ? / L W
7 年 否 empty 或1970-2099 , - * /
2、常用通配符说明
符号* 表示所有值. 例如:在分的字段上设置 “*”,表示每一分钟都会触发。
符号? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。
例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
符号 - 表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。
符号, 表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
符号/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每 月1号开始,每隔三天触发一次。
3、常用表达式
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *”每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
4、时间转换成任务表达式cron工具类
package com.task;
import cn.hutool.core.date.DateUtil;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
/**
* @Date: 2023/8/16 09:50
* @Classname: DateTimeToCronUtils
* @Description: 时间转换成任务表达式cron工具类
*/
public class DateTimeToCronUtils {
/**
* 每年format格式
*/
public static final String YEAR = "ss mm HH dd MM ? yyyy";
/**
* 每周format格式
*/
public static final String MONDAY = "ss mm HH ? * 1";
public static final String TUESDAY = "ss mm HH ? * 2";
public static final String WEDNESDAY = "ss mm HH ? * 3";
public static final String THURSDAY = "ss mm HH ? * 4";
public static final String FRIDAY = "ss mm HH ? * 5";
public static final String SATURDAY = "ss mm HH ? * 6";
public static final String SUNDAY = "ss mm HH ? * 7";
/**
* 每天format格式
*/
public static final String EVERYDAY = "ss mm HH * * ?";
/**
* 间隔-每天format格式
*/
public static final String INTERVAL_DAY = "0 0 0 1/param * ? ";
/**
* 间隔-每小时format格式
*/
public static final String INTERVAL_HOUR = "0 0 0/param * * ?";
/**
* 间隔-每分钟format格式
*/
public static final String INTERVAL_MINUTE = "0 0/param * * * ? ";
/**
* LocalDateTime格式化为String
*
* @param date LocalDateTime
* @param dateFormat format格式
* @return String
* @author longwei
*/
public static String formatDateByPattern(LocalDateTime date, String dateFormat) {
return DateUtil.format(date, dateFormat);
}
/**
* date格式化为String
*
* @param date date
* @param dateFormat format格式
* @return String
* @author longwei
*/
public static String formatDateByPattern(Date date, String dateFormat) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String formatTimeStr = null;
if (date != null) {
formatTimeStr = sdf.format(date);
}
return formatTimeStr;
}
/**
* 时间转换Cron表达式
*
* @param date date
* @param dateFormat format格式
* @return Cron表达式
* @author longwei
*/
public static String getCron(Date date, String dateFormat) {
return formatDateByPattern(date, dateFormat);
}
/**
* 时间转换Cron表达式
*
* @param date date
* @param dateFormat format格式
* @return Cron表达式
* @author longwei
*/
public static String getCron(LocalDateTime date, String dateFormat) {
return formatDateByPattern(date, dateFormat);
}
/**
* 间隔天转换Cron表达式
*
* @param param 天
* @return Cron表达式
* @author longwei
*/
public static String getIntervalDayCron(String param) {
return INTERVAL_DAY.replace("param", param);
}
/**
* 间隔小时转换Cron表达式
*
* @param param 小时
* @return Cron表达式
* @author longwei
*/
public static String getIntervalHourCron(String param) {
return INTERVAL_HOUR.replace("param", param);
}
/**
* 间隔分钟转换Cron表达式
*
* @param param 分钟
* @return Cron表达式
* @author longwei
*/
public static String getIntervalMinuteCron(String param) {
return INTERVAL_MINUTE.replace("param", param);
}
public static void main(String[] args) {
Date date = new Date();
String cron = getCron(date, YEAR);
System.out.println("date-每年执行一次" + cron);
cron = getCron(date, MONDAY);
System.out.println("date-每周一执行" + cron);
cron = getCron(date, EVERYDAY);
System.out.println("date-每天执行" + cron);
System.out.println("------------------------------");
LocalDateTime localDateTime = LocalDateTime.now();
cron = getCron(localDateTime, YEAR);
System.out.println("localDateTime-每年执行一次" + cron);
cron = getCron(localDateTime, MONDAY);
System.out.println("localDateTime-每周一执行" + cron);
cron = getCron(localDateTime, EVERYDAY);
System.out.println("localDateTime-每天执行" + cron);
LocalDate localDate = LocalDate.now();
LocalDateTime dateTime = localDate.atTime(13, 14);
cron = getCron(dateTime, EVERYDAY);
System.out.println("localDateTime-每天指定时间执行" + cron);
cron = getIntervalDayCron("1");
System.out.println("localDateTime-间隔1天执行" + cron);
cron = getIntervalHourCron("2");
System.out.println("localDateTime-间隔2小时执行" + cron);
cron = getIntervalMinuteCron("5");
System.out.println("localDateTime-间隔5分钟执行" + cron);
}
}