需求:实现一个简单的定时任务
Version:1
/**
* 这是一个简单的定时任务类
*/
public class Timing extends TimerTask{
@Test
public static void main(String[] args) {
Timing timing = new Timing();
Timer timer = new Timer();//构建定时器
Date date = timing.setTimer(16, 33, 10);
System.out.println("定时任务执行开始时间:"+date);
timer.schedule(timing,date);
}
// yyyy-MM-dd hh:mm:ss
//设置时分秒
public Date setTimer(Integer hh, Integer mm, Integer ss) {
Calendar calendar = Calendar.getInstance();//获取日历类
calendar.set(calendar.HOUR_OF_DAY, hh); //设置时
calendar.set(calendar.MINUTE, mm);//设置分
calendar.set(calendar.SECOND, ss);//设置秒
Date time = calendar.getTime();//获取date
return time;
}
@Override
public void run() {
//要执行的任务
System.out.println("定时任务执行了");
}
}
Version:2
package com.itcast.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.Timer; import java.util.TimerTask; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.itcast.bean.Vip; import com.itcast.dao.VipMapper; /** * 这是一个简单的定时任务类 */ public class Timing extends TimerTask implements VipMapper{ //获取东八区时间 TimeZone zone = TimeZone.getTimeZone("GMT+08:00"); //获取日历类 public Calendar calendar = Calendar.getInstance(zone); public static long forCycle; /** * @param1 开始执行时间 * @param2 任务间隔时间 * @param3 是否执行任务 @param4 下次执行时间 */ public static void runTiming(String date,long cycle,boolean flag,long nextTime){ Timing timing=new Timing(); //构建定时器 Timer timer = new Timer(); //设置的时间 Date startTime=new Date(date); //最新的时间 Date nowDate = new Date(); //如果时间已经过去需要的 下次执行时间 System.out.println("设置时间为:"+startTime.toLocaleString()); System.out.println("当前时间为:"+new Date().toLocaleString()); System.out.println("nextTime:"+nextTime); forCycle=(60*60*1000)*cycle; if(flag){ int i = startTime.compareTo(nowDate);//设置时间与当前时间作比较 if(i>=0){//如果设置时间>0表示设置的时间 未到 =0表示 时间想等 <0表示时间已经过去了 timer.schedule(timing, startTime,forCycle); }else{ System.out.println("设置时间已经过期,延迟至下一个周期执行,下次执行时间为:"+Timing.getTime(nextTime)+" 以后"); //参数1 继承类 //参数2 如果设置时间小于当前时间 延迟多长时间后才会执行的参数 //参数3 循环执行周期 timer.schedule(timing,nextTime,forCycle); } }else{ System.out.println("任务未开启,无法执行"); } } /* // yyyy-MM-dd hh:mm:ss //设置时分秒 public Date setTimer(Integer hh, Integer mm, Integer ss) { calendar.set(calendar.HOUR_OF_DAY, hh); //设置时 calendar.set(calendar.MINUTE, mm);//设置分 calendar.set(calendar.SECOND, ss);//设置秒 Date time = calendar.getTime();//获取date return time; }*/ //要执行的任务 @Override public void run() { System.out.println("定时任务开始执行,当前时间:"+new Date().toLocaleString()); List
@param4 下次执行时间 */ public static void runTiming(String date,long cycle,boolean flag,long nextTime){ Timing timing=new Timing(); //构建定时器 Timer timer = new Timer(); //设置的时间 Date startTime=new Date(date); //最新的时间 Date nowDate = new Date(); //如果时间已经过去需要的 下次执行时间 System.out.println("设置时间为:"+startTime.toLocaleString()); System.out.println("当前时间为:"+new Date().toLocaleString()); System.out.println("nextTime:"+nextTime); forCycle=(60*60*1000)*cycle; if(flag){ int i = startTime.compareTo(nowDate);//设置时间与当前时间作比较 if(i>=0){//如果设置时间>0表示设置的时间 未到 =0表示 时间想等 <0表示时间已经过去了 timer.schedule(timing, startTime,forCycle); }else{ System.out.println("设置时间已经过期,延迟至下一个周期执行,下次执行时间为:"+Timing.getTime(nextTime)+" 以后"); //参数1 继承类 //参数2 如果设置时间小于当前时间 延迟多长时间后才会执行的参数 //参数3 循环执行周期 timer.schedule(timing,nextTime,forCycle); } }else{ System.out.println("任务未开启,无法执行"); } } /* // yyyy-MM-dd hh:mm:ss //设置时分秒 public Date setTimer(Integer hh, Integer mm, Integer ss) { calendar.set(calendar.HOUR_OF_DAY, hh); //设置时 calendar.set(calendar.MINUTE, mm);//设置分 calendar.set(calendar.SECOND, ss);//设置秒 Date time = calendar.getTime();//获取date return time; }*/ //要执行的任务 @Override public void run() { System.out.println("定时任务开始执行,当前时间:"+new Date().toLocaleString()); Listlist = list(); for (int i = 0; i < list.size(); i++) { Date date = list.get(i).getBorthday(); //获取日期格式化 SimpleDateFormat sdf=new SimpleDateFormat("MM-dd"); String borthday = sdf.format(date); System.out.println(list.get(i).getName()+"的生日是:"+borthday); //获取当前日期 String str = sdf.format(new Date()); if(borthday.equals(str)){ SimpleDateFormat sdf1=new SimpleDateFormat("yyyy"); //数据库中的 年份 String y = sdf1.format(list.get(i).getBorthday()); //当前 年份 String ny=sdf1.format(new Date()); Integer year = new Integer(y); Integer nowYear = new Integer(ny); String msg="亲爱的"+list.get(i).getName()+",今天是你"+(nowYear-year)+"岁的生日,在此祝你"+ "工作顺利 生活幸福 "; try { SendEmail.sendMail(list.get(i).getEmail(),msg); } catch (Exception e){ e.printStackTrace(); } }else{ System.out.println(list.get(i).getName()+"没过生日"); } } System.out.println("定时任务执行结束,当前时间:"+new Date().toLocaleString()); } //查数据库 @Override public List list() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); VipMapper vipMapper = ac.getBean(VipMapper.class); List list = vipMapper.list(); return list; } //日期转换时间戳 public static List turnDate(Date newDate,Date setDate) { //时间转换为24小时制 SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //SimpleDateFormat sdf=new SimpleDateFormat("HH"); List list=new ArrayList (); //最新时间转化时间戳过程 String str1 = sdf.format(newDate); Date d; try { d = sdf.parse(str1); long newDateTime = d.getTime(); //设置时间转换时间戳过程 String str2 = sdf.format(setDate); Date d1 = sdf.parse(str2); long setDateTime = d1.getTime(); //添加到集合当中去 list.add(0,newDateTime); list.add(1,setDateTime); } catch (ParseException e) { e.printStackTrace(); } return list; } //把一个 long 时间戳转换成小时,分钟,秒 格式String 并返回 public static String getTime(long time) { String str = "" ; time = time / 1000; int s = (int) (time % 60); int m = (int) (time / 60 % 60); int h = (int) (time / 3600); str = h + "小时" + m + "分" + s +"秒"; return str ; } } list = list(); for (int i = 0; i < list.size(); i++) { Date date = list.get(i).getBorthday(); //获取日期格式化 SimpleDateFormat sdf=new SimpleDateFormat("MM-dd"); String borthday = sdf.format(date); System.out.println(list.get(i).getName()+"的生日是:"+borthday); //获取当前日期 String str = sdf.format(new Date()); if(borthday.equals(str)){ SimpleDateFormat sdf1=new SimpleDateFormat("yyyy"); //数据库中的 年份 String y = sdf1.format(list.get(i).getBorthday()); //当前 年份 String ny=sdf1.format(new Date()); Integer year = new Integer(y); Integer nowYear = new Integer(ny); String msg="亲爱的"+list.get(i).getName()+",今天是你"+(nowYear-year)+"岁的生日,在此祝你"+ "工作顺利 生活幸福 "; try { SendEmail.sendMail(list.get(i).getEmail(),msg); } catch (Exception e){ e.printStackTrace(); } }else{ System.out.println(list.get(i).getName()+"没过生日"); } } System.out.println("定时任务执行结束,当前时间:"+new Date().toLocaleString()); } //查数据库 @Override public List list() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); VipMapper vipMapper = ac.getBean(VipMapper.class); List list = vipMapper.list(); return list; } //日期转换时间戳 public static List turnDate(Date newDate,Date setDate) { //时间转换为24小时制 SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //SimpleDateFormat sdf=new SimpleDateFormat("HH"); List list=new ArrayList (); //最新时间转化时间戳过程 String str1 = sdf.format(newDate); Date d; try { d = sdf.parse(str1); long newDateTime = d.getTime(); //设置时间转换时间戳过程 String str2 = sdf.format(setDate); Date d1 = sdf.parse(str2); long setDateTime = d1.getTime(); //添加到集合当中去 list.add(0,newDateTime); list.add(1,setDateTime); } catch (ParseException e) { e.printStackTrace(); } return list; } //把一个 long 时间戳转换成小时,分钟,秒 格式String 并返回 public static String getTime(long time) { String str = "" ; time = time / 1000; int s = (int) (time % 60); int m = (int) (time / 60 % 60); int h = (int) (time / 3600); str = h + "小时" + m + "分" + s +"秒"; return str ; } }