4

Я использую ScheduledExecutorService для выполнения конкретной задачи на 3 AM утром каждый день. Теперь я не уверен, будет ли мой ниже код звонить MyTask() каждые 3 AM утром? Так как я не уверен, является ли моя логика является правильным или нетЗапланировать задачу каждый день, используя ScheduledExecutorService?

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); 

И проверить это, я должен ждать в течение одного дня, чтобы увидеть, если он работает, и я не хочу, чтобы сделать это.

Может ли кто-нибудь помочь мне определить, является ли мой код выше или нет?

+0

Почему бы не изменить время до ближайшего времени, чтобы проверить? или изменить системное время, а также – Keerthivasan

+0

Я могу запускать каждые 15 минут, но я ищу, чтобы запускать каждые 3 часа утра. –

ответ

3

Ваш код также прав, но проблема в том, что окно ошибки в вашем случае составляет + -59 минут и + -59 секунд, т. Е. Ваши задачи могут быть запланированы на период от 3.00 утра до 4.00 утра, но если вы хотите больше точным, то попробуйте это,

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); 

EDIT Если вы посмотрите на [Переход на летнее время]) http://en.wikipedia.org/wiki/Daylight_saving_time) вы можете увидеть в сколько стран используется этот переход на летнее и в летнее часы являются скорректированный максимум + -1 час, и это тоже только два раза в год, а затем, если ваша задача настолько надежна, что она должна корректироваться для этого изменения, вы можете отрегулировать это изменение путем повторного вызова вышеупомянутого кода и выключения предыдущего планировщика на scheduler.shutdown();.

+0

Спасибо за предложение и вопрос о проблеме с дневным сбережением?> –

+0

@SSH просто посмотрите отредактированный ответ для вашей проблемы с летним временем. – dbw

Смежные вопросы