4

我习惯于每天早上ScheduledExecutorService运行一项特定任务3 AM。现在我不确定我下面的代码是否会在MyTask()每天3 AM早上调用?因为我不确定我的逻辑是否正确

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Date aDate = ......// Current date or parsed date;
Calendar with = Calendar.getInstance();
with.setTime(aDate);
int hour = with.get(Calendar.HOUR);
int intDelayInHour = hour < 3 ? 3 - hour : 24 - (hour - 3);

scheduler.scheduleAtFixedRate(new MyTask(), intDilayInHour, 24, TimeUnit.HOURS); 

为了测试这一点,我需要等待一天看看它是否有效,我不想这样做。

谁能帮我确定我上面的代码是否正确?

4

1 回答 1

3

您的代码也是正确的,但问题是您的错误窗口是 +-59 分钟和 +-59 秒,即您的任务可以安排在凌晨 3 点到凌晨 4 点之间运行,但如果您想要更准确,请尝试这个,

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Date aDate = new Date();// Current date or parsed date;

Calendar with = Calendar.getInstance();
with.setTime(aDate);
int hour = with.get(Calendar.HOUR_OF_DAY);
int Minutes = with.get(Calendar.MINUTE);

int MinutesPassed12AM = hour * 60 + Minutes;
int MinutesAt3AM = 3 * 60;
int OneDayMinutes = 24 * 60;
long DelayInMinutes = MinutesPassed12AM <= MinutesAt3AM ? MinutesAt3AM - MinutesPassed12AM : OneDayMinutes - (MinutesPassed12AM - MinutesAt3AM);


scheduler.scheduleAtFixedRate(new MyTask(), DelayInMinutes, OneDayMinutes, TimeUnit.MINUTES); 

编辑 如果您查看 [夏令时]) http://en.wikipedia.org/wiki/Daylight_saving_time ) 您可以看到在多少个国家/地区使用了这种夏令时,并且在夏令时中时钟被调整为最大 +-1小时,一年也只有两次,如果您的任务非常强大以至于它应该适应这种变化,那么您可以通过重新调用上述代码并关闭以前的调度程序来适应这种变化scheduler.shutdown();

于 2013-12-05T07:45:24.253 回答