首页 > 解决方案 > java中仅每24小时或一天调用一次函数的逻辑

问题描述

我有一个功能

callEach24hourOneTime();

一旦执行,我必须在每 24 小时内仅在 24 内调用一次此函数,然后我不必调用 callEach24hourOneTime

我无法以毫秒为单位获取当前时间小时分钟和秒,以便我可以应用我在逻辑下尝试但无法执行的条件。

if(currentmillis=86400000 ){
 callEach24hourOneTime(); 
}
else {
//dont call do other operation
}

请为此建议我的解决方案。

标签: java

解决方案


在方法执行之间始终至少有 24 小时的逻辑callEach24hourOneTime()

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 {
    // ...
}

推荐阅读