在Java中,仅每24小时或一天调用一次函数的逻辑

时间:2018-10-25 15:49:20

标签: java

我有一个功能

callEach24hourOneTime();

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

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

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

请为我提出解决方案。

2 个答案:

答案 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()每天执行一次。