Java 使用ScheduledExecutorService每天计划一项任务?

Java 使用ScheduledExecutorService每天计划一项任务?,java,calendar,background-thread,scheduledexecutorservice,Java,Calendar,Background Thread,Scheduledexecutorservice,我每天早上使用ScheduledExecutorService在3点运行特定任务。现在我不确定我下面的代码是否会在每天凌晨3点调用MyTask()?因为我不确定我的逻辑是否正确 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Date aDate = ......// Current date or parsed date; Calendar with = Calendar.getInstance

我每天早上使用
ScheduledExecutorService
3点运行特定任务。现在我不确定我下面的代码是否会在每天凌晨3点调用
MyTask()
?因为我不确定我的逻辑是否正确

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); 
ScheduledExecutorService调度器=执行者。newScheduledThreadPool(1);
日期日期=……//当前日期或解析日期;
Calendar with=Calendar.getInstance();
设置时间(aDate);
int hour=with.get(Calendar.hour);
int intDelayInHour=小时<3?3小时:24小时(3小时);
scheduleAtFixedRate(new MyTask(),intDilayInHour,24,TimeUnit.HOURS);
为了验证这一点,我需要等待一天,看看它是否有效,我不想这样做


有人能帮我确定我的上述代码是否正确吗?

您的代码也正确,但问题是您的错误窗口为+-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); 
ScheduledExecutorService调度器=执行者。newScheduledThreadPool(1);
日期日期=新日期();//当前日期或解析日期;
Calendar with=Calendar.getInstance();
设置时间(aDate);
int hour=with.get(Calendar.hour\u OF_DAY);
int Minutes=with.get(Calendar.MINUTE);
int MinutesPassed12AM=小时*60+分钟;
凌晨3点的整数分钟=3*60;
int一天分钟=24*60;

long DelayInMinutes=分钟已过12AM为什么不将时间更改为更接近您的测试时间?或者也可以更改系统时间我可以每15分钟运行一次,但我希望每凌晨3点运行一次..谢谢您的建议,夏令时问题呢?>@SSH请查看夏令时问题的编辑答案。