Как каждый день проверять время на попадание в интервал между часами начала и конца?

Рейтинг: 0Ответов: 1Опубликовано: 14.02.2023

Мне требуется выполнять некий код в программе в определенные часы. К примеру ставим диапазон 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('Не входит в диапазон');

Ответы

▲ 2Принят

Текущее время попадает в диапазон, если выполнено одно из двух условий:

  • Время начала меньше времени окончания (интервал внутри суток), и текущее время внутри диапазона.
  • Время начала больше времени окончания (интервал пересекает границу суток), и текущее время либо больше времени начала, либо меньше времени окончания.

Предлагаю уменьшить количество жонглирований строками при помощи 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('Не входит в диапазон');