我有一个频率和时间范围,必须用它来执行频率。 例如,如果当前时间是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);
}
答案 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);