我有一个方法,应该无限期地每天晚上 9 点执行。如果错过了时间(因为机器/笔记本电脑处于非活动状态),则应在第二天晚上 9 点执行。这应该一直运行。我尝试了下面的代码,但是该方法执行了一次,第二天就没有执行
Calendar now = Calendar.getInstance();
// Set the desired time to 9 PM
Calendar desiredTime = Calendar.getInstance();
desiredTime.set(Calendar.HOUR_OF_DAY, 21); // 9 PM
desiredTime.set(Calendar.MINUTE, 0);
desiredTime.set(Calendar.SECOND, 0);
desiredTime.set(Calendar.MILLISECOND, 0);
// Check if the desired time is in the past, if so, add one day
if (now.after(desiredTime)) {
desiredTime.add(Calendar.DAY_OF_MONTH, 1);
}
long delay = desiredTime.getTimeInMillis() - now.getTimeInMillis();
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
// method to be called
}
});
}
}, delay, 24 * 60 * 60 * 1000); // 24 hours in milliseconds
如果您将 Spring 与 Java 一起使用,一种选择是使用 @Scheduled 与 cron 表达式。
类似这样的:
@Scheduled(cron = "0 0 21 * * ?", zone = "Europe/Paris")
您可以在这里找到有关@Scheduled的更多信息:https://www.baeldung.com/spring-scheduled-tasks。
您可以在这里使用 cron 表达式:https://www.freeformatter.com/cron-expression-generator-quartz.html