我有一个功能
callEach24hourOneTime();
我必须在24小时内每24小时调用一次此函数,一旦它执行一次,则不必调用callEach24hourOneTime
我无法以毫秒为单位获取当前时间的时分秒,因此我无法应用在逻辑下尝试的条件,但无法执行。
if(currentmillis=86400000 ){
callEach24hourOneTime();
}
else {
//dont call do other operation
}
请为我提出解决方案。
答案 0 :(得分:1)
在执行callEach24hourOneTime()
方法之间至少要连续 24小时的逻辑:
private long nextCallMillis;
long currentMillis = System.currentTimeMillis();
if (currentMillis >= this.nextCallMillis) {
this.nextCallMillis = currentMillis + 86400000/*24 hours*/;
callEach24hourOneTime();
} else {
// ...
}
这将导致一天中该方法执行的时间偏移。漂移的速度取决于代码执行的频率。
如果您希望在每天的同一时间(大约)调用该方法:
private long nextCallMillis;
long currentMillis = System.currentTimeMillis();
if (this.nextCallMillis == 0)
this.nextCallMillis = currentMillis; // Establish time-of-day
if (currentMillis >= this.nextCallMillis) {
this.nextCallMillis += ((currentMillis - this.nextCallMillis) / 86400000 + 1) * 86400000;
callEach24hourOneTime();
} else {
// ...
}
“每天的同一时间”以UTC表示,因此当夏令时更改时,一天中的时间将更改1小时。
更新
如果您只想“每天一次”的逻辑:
private LocalDate lastCallDate;
LocalDate today = LocalDate.now();
if (! today.equals(lastCallDate)) {
this.lastCallDate = today;
callOnceDailyOneTime();
} else {
// ...
}
答案 1 :(得分:0)
您可以使用cron库。
我真的不知道您当前正在使用哪种语言或框架,但是从春季开始,我会说您可以使用@Scheduled:
@Scheduled(cron = "0 0 0 * * *")
private void myMethod(){}
例如,上面的cron将使myMethod()每天执行一次。