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

Java 根据频率和服务器的启动设置任务的启动,java,events,Java,Events,我有一个执行频率的频率和时间范围。 例如,如果当前时间为凌晨2点,频率为360分钟,则必须假设 由于刚过午夜,任务应在12点后360分钟执行,即上午6点 当前时间是从午夜开始的服务器启动时间。 所以,如果服务器在早上5点启动,并且frequency是360,那么任务应该在早上6点运行 但是如果任务是早上5点,频率是240,因为从午夜开始已经过了240分钟 下一次跑步应该在上午8点 如果服务器在上午10点启动,频率为300,则从午夜开始,一次运行在上午5点结束,下一次运行在上午10点计算,因此将在

我有一个执行频率的频率和时间范围。 例如,如果当前时间为凌晨2点,频率为360分钟,则必须假设 由于刚过午夜,任务应在12点后360分钟执行,即上午6点

当前时间是从午夜开始的服务器启动时间。 所以,如果服务器在早上5点启动,并且frequency是360,那么任务应该在早上6点运行

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

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

时间范围分为四个季度,即上午12点至上午6点至下午12点、下午12点至下午6点和下午6点至次日上午12点 下面的代码在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);       
    }
stNow----serverTime
从午夜开始经过的时间
频率
受保护的int_getInitWorkerTime()
{
int-vRun=0;
STime stNow=新的STime(PWMSystem.newDate());
int currFreq=\u findAlertFrequency()/60;
int sElapsed=常数。分钟/天-stNow.elapsedMinutes(时间:午夜);
_log.error(“现在时间为24------”+stNow.getHourNo24());
_log.error(“现在currFreq------”+currFreq);
_log.error(“现在选择------”+sElapsed);
if(sElapsed==1440)
sElapsed=0;
如果(stNow.getHourNo24()>=0&&stNow.getHourNo24()已选择)
vRun=选择的当前频率;
其他的
vRun=-(当前频率选择);
}
if(stNow.getHourNo24()>6&&stNow.getHourNo24()选择)
vRun=360-(选择当前频率);
其他的
vRun=360-((当前频率选择));
}
if(stNow.getHourNo24()>12&&stNow.getHourNo24()选择)
vRun=720-(选择当前频率);
其他的
vRun=720-((当前频率选择));
}

如果(stNow.getHourNo24()>18&&(stNow.getHourNo24()

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)    
在我看来,一切都是正确的。你提到将时间范围划分为四分之一,但我不认为这是可取的或相关的……你不是真的在每种情况下都在谈论“午夜后的分钟数”吗?请注意,按照我的表达方式,你可以将其更改为“午夜后的秒数”或“午夜后的毫秒数”—甚至“从月初算起的分钟数”;只要你有一个始终如一的原点和时间单位,它就会很好地工作

(请注意,我指的是周期而不是频率-通常频率越高意味着事情发生得越频繁,而不是越少。)

我发现

protected int _getInitWorkerTime()
{   
        int vRun = 0;
        STime stNow = new STime(PWMSystem.newDate());
        int currFreq = _findAlertFrequency() / Constants.SECONDS_PER_MINUTE;
        int sElapsed = Constants.MINUTES_PER_DAY- stNow.elapsedMinutes(STime.midnight);
        int runsCompleted = sElapsed / currFreq;
        int remainLeft = (runsCompleted + 1) * currFreq;


                if (remainLeft > sElapsed)
                    vRun = remainLeft - sElapsed;
                else
                    vRun = sElapsed - remainLeft;


return (vRun * 60 + _BOOT_DELAY_SECONDS_START);

也许将赏金增加到500美元会有所帮助:)您发布的函数用于初始化某些需要在特定时间运行的任务,对吗?该函数在启动时是否仅对每个任务执行一次?因此,如果您调用该函数,返回值是任务需要启动的时间?@gabe:-您是对的。这是用于启动任务。该函数仅执行一次在初始化时,_BOOT_DELAY_SECONDS_START的值是多少?_BOOT_DELAY_SECONDS_START只是任务开始时的一个偏移量将小于60秒或1分钟。从您的响应中,我做了一些修改,效果很好,谢谢这看起来仍然有很多代码…您真的确定它需要这么复杂吗?