在我们做web项目的时候有些需求需要我们定时每周每天执行什么任务,这里给大家介绍一种方式,我就直接贴代码
web.xml
<listener>
<listener-class>com.hw.util.BeginRun</listener-class>
</listener>
public class BeginRun implements ServletContextListener {
java.util.Timer timer = Time.getSingle();
//启动执行
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
//设置时间格式
try {
//设置从此刻时间开始 建议设置未来时间,不然项目启动的话就会先执行一次
DateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
Date date2 = getThisWeekMonday(date);//获取下星期6的时间
if (date.getTime() >= date2.getTime()) {//如果当前时间不小于周六的时间,
Calendar cal = Calendar.getInstance();
cal.setTime(date2);
cal.add(Calendar.WEEK_OF_MONTH, +1);//周数加一
date2 = cal.getTime();
}
// date2 = dateFormat2. parse("2018-11-28 22:58:00");
//第二个参数为从这个时间开始,第三个参数为间隔的时间,NFDFlightDataTimerTask为执行具体方法的类
timer.scheduleAtFixedRate(new NFDFlightDataTimerTask(event.getServletContext()), date2, 60 * 60 * 24 * 7 * 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
//销毁执行的方法
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("*************定时器销毁");
event.getServletContext().log("定时器销毁");
}
/**
* @Description: 获取下周星期6的方法
* @Param: [date]
* @return: java.util.Date
* @Author: hw
* @Date: 2018/11/28
*/
public static Date getThisWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
cal.set(Calendar.HOUR_OF_DAY, 02);
cal.set(Calendar.MINUTE, 00);
cal.set(Calendar.SECOND, 00);
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期6
cal.setFirstDayOfWeek(Calendar.SATURDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
return cal.getTime();
}
}
class Time {
private Time() {
}
private static java.util.Timer timer = null;
public static java.util.Timer getSingle() {
if (timer == null) {
timer = new java.util.Timer();
}
return timer;
}
}
NFDFlightDataTimerTask类
public class NFDFlightDataTimerTask extends TimerTask {
private ServletContext context = null;
public NFDFlightDataTimerTask(ServletContext context) {
this.context = context;
}
/**
* @Description: 执行的方法
* @Param: []
* @return: void
* @Author: hw
* @Date: 2018/11/25
*/
public void run() {
}