我有一个频率和一个时间范围,必须按照该频率执行。 例如,如果当前时间是凌晨 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/