Как каждый день проверять время на попадание в интервал между часами начала и конца?
Мне требуется выполнять некий код в программе в определенные часы. К примеру ставим диапазон 20 - 12. Это значит что код будет выполняться каждую минуту с 20 часов вечера (каждого дня) по 12 часов дня (каждого следующего дня).
Я пробовал использовать InRange в таймере для этих целей, но оно начинает работать неправильно если есть переход на следующие сутки.
К примеру сделать с 7 утра по 8 вечера:
if InRange(strtoint(FormatDateTime('hh', now)), strtoint('07'), strtoint('20'))
И все работает. Но, если я хочу скажем с 8 вечера по 12 часов дня, то такой код уже не работает... диапазон')
var
now_h:string;
dtCurrent,dtFrom,dtTo:TDateTime;
range_hour_begin,range_hour_end:string;
begin
range_hour_begin:='20';
range_hour_end:='15';
now_h:=FormatDateTime('hh', now);
dtCurrent := Now;
dtFrom := RecodeHour(dtCurrent, strtoint(range_hour_begin));
dtTo := RecodeHour(dtCurrent, strtoint(range_hour_end));
if strtoint(range_hour_end) < strtoint(range_hour_begin)
then dtTo := IncDay(dtTo);
if InRange(dtCurrent, dtFrom, dtTo)
then showmessage('Входит в диапазон')
else showmessage('Не входит в диапазон');
Ответы (1 шт):
Текущее время попадает в диапазон, если выполнено одно из двух условий:
- Время начала меньше времени окончания (интервал внутри суток), и текущее время внутри диапазона.
- Время начала больше времени окончания (интервал пересекает границу суток), и текущее время либо больше времени начала, либо меньше времени окончания.
Предлагаю уменьшить количество жонглирований строками при помощи EncodeTime, и формировать значение типа TTime.
Функция Time аналог Now, но возвращает только время без даты.
var tFrom, tTo, tNow: TTime;
...
tFrom = EncodeTime(strtoint(range_hour_begin), 0, 0, 0);
tTo = EncodeTime(strtoint(range_hour_end), 0, 0, 0);
...
tNow = Time;
if (tFrom <= tTo) and (tFrom <= tNow) and (tNow <= tTo)
or
(tFrom > tTo) and ((tFrom <= tNow) or (tNow <= tTo))
then showmessage('Входит в диапазон')
else showmessage('Не входит в диапазон');