java - 根据服务器的频率和启动设置任务的启动

标签 java events

我有一个频率和一个时间范围,必须按照该频率执行。 例如,如果当前时间是凌晨 2 点,频率是 360 分钟,则必须假设 因为刚刚过了午夜,任务应该在 12 点后 360 分钟执行,这意味着早上 6 点

当前时间是服务器从午夜开始的时间。 因此,如果服务器在凌晨 5 点启动并且频率为 360,则任务应在早上 6 点运行

但是如果任务是早上 5 点,频率是 240,因为它已经从午夜开始过了 240 分钟 下一次运行应该在早上 8 点

如果服务器在上午 10 点启动并且频率为 300,那么从午夜开始,运行在上午 5 点结束,下一个运行在上午 10 点计算,因此将在上午 10 点立即开始

时间范围分为4个季度,12AM to 6AM to 12PM ,12PM to 6PM and 6PM to 12AM next day 这是下面的代码,它在 240 和 360 频率下工作正常,但在 60 频率时出错。 下面提供了一些值:

 stNow----serverTime
sElapsed ---time elapsed from midnight
currFreq ----frequecy 
    protected int _getInitWorkerTime()
    {
         int vRun=0;
         STime stNow= new STime(PWMSystem.newDate());
         int currFreq = _findAlertFrequency()/60;
         int sElapsed =Constants.MINUTES_PER_DAY-stNow.elapsedMinutes(STime.midnight);
         _log.error("now time as 24------"+stNow.getHourNo24());
         _log.error("now currFreq------"+currFreq);
         _log.error("now sElapsed-----"+sElapsed);
         if(sElapsed == 1440)
             sElapsed=0;
         if(stNow.getHourNo24()>=0  && stNow.getHourNo24()<=6)
         {
             _log.error("now time as 24-inside cond-1-----"+stNow.getHourNo24());
                 if(currFreq>sElapsed)
                     vRun= currFreq-sElapsed;
                 else
                     vRun= -(currFreq-sElapsed);
         }
         if(stNow.getHourNo24()>6 && stNow.getHourNo24()<=12)
         {
             _log.error("now time as 24-inside cond-2-----"+stNow.getHourNo24());
             if(currFreq>sElapsed)
                  vRun=360-(currFreq-sElapsed);
              else
                  vRun=360-(-(currFreq-sElapsed));
         }
         if(stNow.getHourNo24()>12 && stNow.getHourNo24()<=18)
         {
             _log.error("now time as 24-inside cond-3-----"+stNow.getHourNo24());
             if(currFreq>sElapsed)
                  vRun=720-(currFreq-sElapsed);
              else
                  vRun=720-(-(currFreq-sElapsed));
         }
         if(stNow.getHourNo24()>18 && (stNow.getHourNo24()<=24 ||stNow.getHourNo24()<=0))
         {
             _log.error("now time as 24-inside cond-4-----"+stNow.getHourNo24());
             if(currFreq>sElapsed)
                  vRun=1080-(currFreq-sElapsed);
              else
                  vRun=1080-(-(currFreq-sElapsed));
         }
            // vRun=_MAX_FREQUENCY_DELAY_IN_SEC+ sElapsed*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START;*/
        //vRun=stNow.elapsedMinutes(STime.midnight)*60+_findAlertFrequency()+_BOOT_DELAY_SECONDS_START;
        return (vRun*60 + _BOOT_DELAY_SECONDS_START);       
    }

最佳答案

不就是这样说吗:

int nextTime = ((timeSinceMidnight / (period-1)) + 1) * period;

(其中除法是用整数运算完成的。“period-1”位是为了捕获它完全的情况,例如下面的第三个测试用例。)

示例情况:

Period      Minutes since midnight        Result
360         120 (2am)                     360 (6am)
240         300 (5am)                     480 (8am)
300         600 (10am)                    600 (10am)    

在我看来一切都是正确的。您提到将时间范围划分为几个季度,但我不认为这是可取的或相关的……您真的不是在每种情况下都在谈论“自午夜以来的分钟数”吗?请注意,按照我的表达方式,您可以将其更改为“自午夜以来的秒数”或“自午夜以来的毫秒数”——甚至是“自月初以来的分钟数”;只要您具有一致的起源和时间单位,它应该可以正常工作。

(请注意,我指的是周期而不是频率 - 通常更高的频率意味着某事发生的次数更多,而不是更少。)

关于java - 根据服务器的频率和启动设置任务的启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408170/

相关文章:

java - 创建具有 IDE 上下文行为的 Java 注解

java - 对 ListActivity 中的 ListView 进行排序

java - 自动将样式表转换为内联样式

javascript - 在窗口单击事件中访问元素及其子/后代

javascript - 通过 f11 启用全屏后通过 javascript 禁用全屏

java - 如何在 HL7 消息中使用转义字符

java - timer.schedule() 根本不工作(在 Java 中)

javascript - 仅用于浏览器关闭的确认消息。不在窗口选项卡关闭时

java - 总重量。如何在一个事件中处理两个相似的 Action ?

javascript - 如何在客户端图像 map 上制作 IE fireevent