suntsh 2014-09-07 10:18 采纳率: 0%

# 请教一个算法问题

• 写回答

#### 1条回答默认 最新

• tianchao_ 2014-09-09 10:01
关注

[code="java"]
package com.kuke.update.timmer;

import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**

• 定时任务
• 用于定时提交索引、定时刷新搜索词缓存
*/
public class ScheduledExceutor extends TimerTask {

private String jobName = "";

private static ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

public ScheduledExceutor(String jobName) {
super();
this.jobName = jobName;
}

@Override
public void run() {

}

/**

• 计算从当前时间currentDate开始，满足条件dayOfWeek, hourOfDay, minuteOfHour,
• secondOfMinite的最近时间
*/
public Calendar getEarliestDate(Calendar currentDate, int dayOfWeek, int hourOfDay, int minuteOfHour, int secondOfMinite) {
// 计算当前时间的WEEK_OF_YEAR,DAY_OF_WEEK, HOUR_OF_DAY, MINUTE,SECOND等各个字段值
int currentWeekOfYear = currentDate.get(Calendar.WEEK_OF_YEAR);
int currentDayOfWeek = currentDate.get(Calendar.DAY_OF_WEEK);
int currentHour = currentDate.get(Calendar.HOUR_OF_DAY);
int currentMinute = currentDate.get(Calendar.MINUTE);
int currentSecond = currentDate.get(Calendar.SECOND);

// 如果输入条件中的dayOfWeek小于当前日期的dayOfWeek,则WEEK_OF_YEAR需要推迟一周
boolean weekLater = false;
if (dayOfWeek < currentDayOfWeek) {
weekLater = true;
} else if (dayOfWeek == currentDayOfWeek) {
// 当输入条件与当前日期的dayOfWeek相等时，如果输入条件中的
// hourOfDay小于当前日期的
// currentHour，则WEEK_OF_YEAR需要推迟一周
if (hourOfDay < currentHour) {
weekLater = true;
} else if (hourOfDay == currentHour) {
// 当输入条件与当前日期的dayOfWeek, hourOfDay相等时，
// 如果输入条件中的minuteOfHour小于当前日期的
// currentMinute，则WEEK_OF_YEAR需要推迟一周
if (minuteOfHour < currentMinute) {
weekLater = true;
} else if (minuteOfHour == currentSecond) {
// 当输入条件与当前日期的dayOfWeek, hourOfDay，
// minuteOfHour相等时，如果输入条件中的
// secondOfMinite小于当前日期的currentSecond，
// 则WEEK_OF_YEAR需要推迟一周
if (secondOfMinite < currentSecond) {
weekLater = true;
}
}
}
}
if (weekLater) {
// 设置当前日期中的WEEK_OF_YEAR为当前周推迟一周
currentDate.set(Calendar.WEEK_OF_YEAR, currentWeekOfYear + 1);
}
// 设置当前日期中的DAY_OF_WEEK,HOUR_OF_DAY,MINUTE,SECOND为输入条件中的值。
currentDate.set(Calendar.DAY_OF_WEEK, dayOfWeek);
currentDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
currentDate.set(Calendar.MINUTE, minuteOfHour);
currentDate.set(Calendar.SECOND, secondOfMinite);
return currentDate;

}

public static void main(String[] args) {
//每周3 、12点、0分、0秒执行 (sunday:1 作为一周第一天)
int dayOfWeek_upindex = 4;
int hourOfDay_upindex = 12;
int minuteOfHour_upindex = 0;
int secondOfMinite_upindex = 0;
ScheduledExceutor job = new ScheduledExceutor("");
Calendar currentDate = Calendar.getInstance();
long currentDateLong = currentDate.getTime().getTime();
Calendar earliestDate = job.getEarliestDate(currentDate, dayOfWeek_upindex, hourOfDay_upindex, minuteOfHour_upindex,
secondOfMinite_upindex);
long earliestDateLong = earliestDate.getTime().getTime();
// 计算从当前时间到最近一次执行时间的时间间隔
long delay = earliestDateLong - currentDateLong;
System.out.println(delay);

// long period = 7 * 24 * 60 * 60 * 1000;
// service.scheduleAtFixedRate(job, delay, period, TimeUnit.MILLISECONDS);

``````}
``````

}
[/code]

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

#### 悬赏问题

• ¥15 关于#python#的问题
• ¥15 主机可以ping通路由器但是连不上网怎么办
• ¥15 数据库一张以时间排好序的表中，找出多次相邻的那些行
• ¥50 关于DynamoRIO处理多线程程序时候的问题