定时作业的执行时间配置在数据库里,比如“****-**-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:00
String planTime2 = "****-**-** 03:00:00"; // 每天03:00:00
try {
// 根据系统时间解析模板日期
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); // 毫秒归零
}
}