java工具類中可以使用定時器功能。假設我們要設置一個週期定時任務,或者日期定時任務可以使用
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, delay, period);
task是業務邏輯,只要根據自己的需求寫需要幹什麼就可以了,delay是第一次執行定時器的時機,period是循環執行定時器的時機,單位都是毫秒。
這個最複雜的就是你第一次執行的時間是多少了,所以需要自己寫一些方法去實現。下面我的思路捋一下,就是在數據庫中或者配置文件中保存類似“4 08:16:10”這樣子的信息,
4代表星期 後面就代表執行的具體時間了,然後去獲取,截取星期和具體時間,計算第一次的執行時機。
代碼如下:
/***
* @author ZHanG
*這個類主要就是將設置週期定時器的第一個時間的毫秒值的計算
* Timer timer = new Timer();
timer.scheduleAtFixedRate(task, delay, period);
設置的參數爲delay
*/
public class WeekMsec {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
//輸入星期,可以從數據庫獲取
int weekDay = 4;
//設置星期得加1
calendar.set(Calendar.DAY_OF_WEEK, weekDay+1);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = dateFormat.format(calendar.getTime());
//可以從數據庫獲取time
String time = "08:16:10";
String str = dateStr+" "+time;
System.out.println(str);
Calendar current = Calendar.getInstance();
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date =format.parse(str);
calendar.setTime(date);
//判斷是否在今日之前
if(calendar.before(current)){
calendar.add(Calendar.DAY_OF_WEEK, 7);
}
} catch (Exception e) {
}
long delay = calendar.getTimeInMillis()-current.getTimeInMillis();
//獲取的毫秒值
System.out.println(delay);
}
}
下面是日期定時器,邏輯基本跟上面無異:
/***
* @author ZHanG
*這個類主要就是將設置日期定時器的第一個時間的毫秒值的計算
* Timer timer = new Timer();
timer.scheduleAtFixedRate(task, delay, period);
設置的參數爲delay
*/
public class DayMsec {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = dateFormat.format(calendar.getTime());
String time = "23:06:00";
String str =dateStr+" "+time;
System.out.println(str);
Calendar current = Calendar.getInstance();
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(str);
calendar.setTime(date);
if(calendar.before(current)){
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
} catch (Exception e) {
}
long delay = calendar.getTimeInMillis()-current.getTimeInMillis();
System.out.println(delay);
}
}