Функция проверки вхождения в диапазон времени суток

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Часто бывает необходимо в скрипте проверить временную точку на вхождение в указанный суточный интервал времени, чтобы сделать что-то или не делать чего-то ... Это не так просто совсем, так как может быть указан интервал времени с переходом через полночь и при сравнении его нужно разбивать на (до 23:59:59 и после, так как иначе сравнение будет не корректным).
! Речь идет именно о суточном интервале времени, т.к. если интервал будет больше функция работает не корректно ибо не использует EpochTime.
Поскольку надоело писать один и тот же кусок скрипта, да ещё переодически где-то ошибаться в нём написал такую функцию.

Код: Выделить всё

#----------------------------------------------------------------------
# FunctionRangeTime by Sertik 04/12/2020
#----------------------------------------------------------------------

# the specified time range must not exceed 24 hours !
# the function does not work correctly if parameters of a non-temporary type are specified

# usage [$FuncRangeTime "start time" "end time"] compares an occurrence in the current system time range
# usage [$FuncRangeTime "start time" "end time" "time"] calculates the occurrence of the specified time range
# example :log info [$FuncRangeTime "20:00:00" "10:00:00" "05:00:00"]



# answer function: 
# "RANGE" - if the time is in the range
# "MISMATCH" - if the time is not in the range
# "EMPTY" - if a zero-length range is specified


global FuncRangeTime do={
:local TimeSet
:local FlagOn 0
:local answer
    :if ([:len $0]!=0) do={
    :if (([:typeof $1]!="nothing") and ([:typeof $2]!="nothing")) do={
           :if ([:len $3]=0) do={:set TimeSet [/system clock get time]} else={:set TimeSet $3}
           :if ($1=$2) do={:set $FlagOn 2}
           :if ($1<$2) do={:if (($1<$TimeSet) && ($TimeSet<$2)) do={:set $FlagOn 1}}
           :if ($1>$2) do={:if (($1<$TimeSet) && ($TimeSet<"23:59:59")) do={:set $FlagOn 1}}
           :if ($1>$2) do={:if (("00:00:00"<=$TimeSet) && ($TimeSet>$1)) do={:set $FlagOn 1}}
           :if ($1>$2) do={:if (("23:59:59">$TimeSet) && ($TimeSet<$2)) do={:set $FlagOn 1}}
            if ($FlagOn=1) do={:set answer "RANGE"}
            if ($FlagOn=0) do={:set answer "MISMATCH"}
            if ($FlagOn=2) do={:set answer "EMPTY"}
     :return $answer} else={:set answer "ERROR"; :log error ("Ошибка в параметре функции "."$[:pick $0 1 [:len $0]]"); :return $answer}
  }
}

# Examles used:
#:log info [$FuncRangeTime "17:00:00" "07:00:00" "23:00:00"]
# :log info [$FuncRangeTime "17:00:00" "07:00:00" "23:00:00"]
# :log info [$FuncRangeTime "17:00:00" "07:00:00"]
# :log info [$FuncRangeTime "17:00:00"]
Проверял, вроде работает корректно при всех вариантах. Если найдется ошибка - сообщите. Может кому пригодится (думаю многим, когда нужно в Планировщике ограничить время работы скрипта суточным интервалом, ведь встроенной такой опции в Планировщике Микротик нет).


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить