定时作业的执行时间配置在数据库里,比如“****-**-05 05:00:00”表示每个月的五日凌晨五点,"****-**** 03:00:00" 表示为每日的凌晨3点执行。
即根据系统的时间,解析两种格式 :1.每个月特定的一天 2.每天特定的时间
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PlanTimeParser {// 定义两种日期格式的正则表达式private static final String MONTHLY_PATTERN = "\\*{4}-\\*{2}-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})"; // 每月某日private static final String DAILY_PATTERN = "\\*{4}-\\*{2}-\\*{2} (\\d{2}:\\d{2}:\\d{2})"; // 每天的时间public static void main(String[] args) {String planTime1 = "****-**-05 05:00:00"; // 每月5日 05:00:00String planTime2 = "****-**-** 03:00:00"; // 每天03:00:00try {// 根据系统时间解析模板日期System.out.println("解析后的每月时间为: " + parsePlanTime(planTime1));System.out.println("解析后的每天时间为: " + parsePlanTime(planTime2));} catch (ParseException e) {e.printStackTrace();}}public static Date parsePlanTime(String planTime) throws ParseException {Calendar calendar = Calendar.getInstance(); // 获取当前系统时间Matcher matcher;// 检查每月某日格式if ((matcher = Pattern.compile(MONTHLY_PATTERN).matcher(planTime)).matches()) {int dayOfMonth = Integer.parseInt(matcher.group(1)); // 提取出每月的某一天setTime(calendar, matcher.group(2)); // 设置时间// 如果当前日期已经超过设定的日子,跳到下个月if (dayOfMonth <= calendar.get(Calendar.DAY_OF_MONTH)) {calendar.add(Calendar.MONTH, 1);}calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); // 设置为当前或下个月的目标日} // 检查每天的时间格式else if ((matcher = Pattern.compile(DAILY_PATTERN).matcher(planTime)).matches()) {setTime(calendar, matcher.group(1)); // 忽略日期部分,直接使用当前系统日期并设置时间} // 如果格式不匹配,抛出异常else {throw new ParseException("无法解析的 planTime 格式: " + planTime, 0);}return calendar.getTime(); // 返回解析后的时间}// 设置时间部分(小时、分钟、秒)private static void setTime(Calendar calendar, String time) throws ParseException {SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");Date parsedTime = timeFormat.parse(time); // 解析时间部分Calendar tempCalendar = Calendar.getInstance();tempCalendar.setTime(parsedTime);calendar.set(Calendar.HOUR_OF_DAY, tempCalendar.get(Calendar.HOUR_OF_DAY)); // 设置小时calendar.set(Calendar.MINUTE, tempCalendar.get(Calendar.MINUTE)); // 设置分钟calendar.set(Calendar.SECOND, tempCalendar.get(Calendar.SECOND)); // 设置秒calendar.set(Calendar.MILLISECOND, 0); // 毫秒归零}
}