要实现的逻辑是每天的0点0分执行myTask()的内容。
import
java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class MyTimer
... {
static Timer timer = new Timer();
public MyTimer()
...{
java.util.Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat ();
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
try
...{
date = sdf.parse("2007-05-24 00:00:00");
}
catch (Exception e)
...{
e.printStackTrace();
System.out.println("Timer error!");
}
timer.schedule(new MyTask(),date,24*60*60*1000);//执行计划,每天执行一次
}
}
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class MyTimer
... {
static Timer timer = new Timer();
public MyTimer()
...{
java.util.Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat ();
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
try
...{
date = sdf.parse("2007-05-24 00:00:00");
}
catch (Exception e)
...{
e.printStackTrace();
System.out.println("Timer error!");
}
timer.schedule(new MyTask(),date,24*60*60*1000);//执行计划,每天执行一次
}
}
但是系统检测到2007-05-24 00:00:00比当前的日期还小,那么系统在启动的时候就先执行MyTask()一次。这样就造成了如果系统并不是在0点0分启动的话,并且启动日期比当前设置的日期大的话,那么以后执行的MyTask()就不是在我们想要的0点0分了(根据jdk文档即使不是这种情况,也会因为gc等操作而导致误差,这个不考虑)。
现在把MyTask执行的日期设置为当前日期的第二天的0点0分。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class MyTimer
... {
static Timer timer = new Timer();
public MyTimer()
...{
Date date = null;
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd 00:00:00");
c.set(Calendar.DAY_OF_MONTH,c.get(Calendar.DAY_OF_MONTH)+1);
try...{
date = sdf.parse(sdf.format(c.getTime()));
}catch(Exception e)...{}
//System.out.println("kk:"+c.get(Calendar.DAY_OF_MONTH));
timer.schedule(new MyTask(),date,24*60*60*1000);//执行计划,每天一次
}
}
这就避免了服务器重起的时候第一次的执行时间问题。
个人愚见,勉励自己!