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

时间:2010-08-04 17:39:08

标签: java events

我有一个频率和时间范围,必须用它来执行频率。 例如,如果当前时间是2AM并且频率是360分钟,则必须假设 因为它刚刚过了午夜,所以任务应该在12点意味着早上6点后执行360分钟

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

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

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

时间范围分为4个季度,上午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);       
    }

2 个答案:

答案 0 :(得分:2)

这不是一个例子:

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)    

所有看起来都对我不对。你提到将时间范围划分为几个季度,但我不知道这是多么可取或相关......你是不是真的只是在谈论“从午夜开始的几分钟”?请注意,我表达它的方式,您可以将其更改为“自午夜起的秒数”或“自午夜以来的毫秒数” - 甚至是“自月初以来的分钟数”;只要你有一个一致的起源和时间单位,它应该可以正常工作。

(请注意,我提到的是周期而不是频率 - 通常情况下,频率越高意味着经常发生更多,而不是更少。)

答案 1 :(得分:0)

我发现是......

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);