Инструменты пользователя

Инструменты сайта


mikrotik:rb3011uias:routeros:system:scripts:functions:day_of_the_week

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
mikrotik:rb3011uias:routeros:system:scripts:functions:day_of_the_week [2020/12/08 10:15]
Николай Солошин
mikrotik:rb3011uias:routeros:system:scripts:functions:day_of_the_week [2022/02/12 11:40] (текущий)
Строка 5: Строка 5:
  
 Мой вариант((В Интернете есть несколько других кейсов, но все они показались мне несколько громоздкими и, по разным сообщениям, не всегда корректно работающим. Вот ссылки на них -- [[https://wiki.mikrotik.com/wiki/Script_to_find_the_day_of_the_week|раз]], [[http://mikrotik-ukraine.blogspot.com/2015/04/routeros.html|два]] и [[https://forum.mikrotik.com/viewtopic.php?t=59029|три]]. Поэтому я разобрался в работе алгоритма -- {{ :mikrotik:rb3011uias:routeros:system:scripts:functions:соответствие_зеллера_вычисление_дня_недели_по_дате_.xlsx |Excel с примером}} -- и собрал свой велосипед. LOL)) функции, которая возвращает текущий день недели основываясь на дате. Использует модифицированный алгоритм Зеллера для программного обеспечения((Подробнее смотрите [[wp>Zeller's_congruence|по ссылке]].)). Мой вариант((В Интернете есть несколько других кейсов, но все они показались мне несколько громоздкими и, по разным сообщениям, не всегда корректно работающим. Вот ссылки на них -- [[https://wiki.mikrotik.com/wiki/Script_to_find_the_day_of_the_week|раз]], [[http://mikrotik-ukraine.blogspot.com/2015/04/routeros.html|два]] и [[https://forum.mikrotik.com/viewtopic.php?t=59029|три]]. Поэтому я разобрался в работе алгоритма -- {{ :mikrotik:rb3011uias:routeros:system:scripts:functions:соответствие_зеллера_вычисление_дня_недели_по_дате_.xlsx |Excel с примером}} -- и собрал свой велосипед. LOL)) функции, которая возвращает текущий день недели основываясь на дате. Использует модифицированный алгоритм Зеллера для программного обеспечения((Подробнее смотрите [[wp>Zeller's_congruence|по ссылке]].)).
 +
 +:!: [[#модификация_функции|Добавлена]] модифицированная функция, которая возвращает массив из дня недели и текущего часа.
  
 ===== Комментарии к коду ===== ===== Комментарии к коду =====
Строка 24: Строка 26:
   :local year;</code>   :local year;</code>
  
-Вводим массивы с данными. Обратите внимание в каком порядке следуют дни недели и какая нумерация у месяцев. Так должно быть согласно алгоритму.+<BOOKMARK:days_array>Вводим массивы с данными. **Обратите внимание** в каком порядке следуют дни недели и какая нумерация у месяцев. Так должно быть согласно алгоритму.
  
 <code>  :local days {"sat";"sun";"mon";"tue";"wed";"thu";"fri";}; <code>  :local days {"sat";"sun";"mon";"tue";"wed";"thu";"fri";};
Строка 39: Строка 41:
   :if ( [ :pick $date 9 10 ] = 0 ) do={ :set year [ :pick $date 10 11 ]; } else={ :set year [ :pick $date 9 11 ]; }</code>   :if ( [ :pick $date 9 10 ] = 0 ) do={ :set year [ :pick $date 10 11 ]; } else={ :set year [ :pick $date 9 11 ]; }</code>
  
-Корректируем номер месяца для Января и Февраля, т.к., согласно алгоритму, они имеют номера 13 и 14 соответственно.+Корректируем номер года для Января и Февраля, т.к., согласно алгоритму, они имеют номера 13 и 14 соответственно.
  
 <code>  :if ( $month = 13 || $month = 14 ) do={ :set year ( $year - 1 ); }</code> <code>  :if ( $month = 13 || $month = 14 ) do={ :set year ( $year - 1 ); }</code>
Строка 96: Строка 98:
     \_+ \$year + ( \$year / 4 ) + ( 5 * \$century ) );\r\     \_+ \$year + ( \$year / 4 ) + ( 5 * \$century ) );\r\
     \n  :set result ( \$days -> ( \$result % 7 ) );\r\     \n  :set result ( \$days -> ( \$result % 7 ) );\r\
 +    \n\r\
 +    \n  :return \$result;\r\
 +    \n}\r\
 +    \n\r\
 +    \n# With love from Vladivostok."</file>
 +
 +===== Модификация функции =====
 +
 +Модифицированная функция, которая возвращает массив из цифры дня недели и цифры часа. Удобна для использования в составе других скриптов, т.к. манипулировать цифрами намного проще. Плюс, она универсальна. Пример вывода [[#пример_использования|смотрите ниже]].
 +
 +НАПИСАТЬ, ГДЕ ВВОДИТСЯ И ГДЕ ИСПОЛЬЗУЕТСЯ,
 +
 +==== Комментарии к коду ====
 +
 +Этот код содержит такие изменения:
 +
 +=== Добавлено ===
 +
 +Получение часа из текущего времени и преобразование строки в число.
 +
 +<code>  :local time [ :tonum [ :pick [ /system clock get time ] 0 2 ] ];</code>
 +
 +Строка для тестирования.
 +
 +<code>  #:local time [ :tonum 14 ];</code>
 +
 +Удаление нуля в первой позиции из времени.
 +
 +<code>  :if ( [ :pick $time 0 1 ] = 0 ) do={ :set time [ :pick $time 0 1 ]; }</code>
 +
 +Сборка массива.
 +
 +<code>  :set ( $result -> "day" ) $day;
 +  :set ( $result -> "time" ) $time;</code>
 +
 +=== Изменено ===
 +
 +Добавлено преобразование в массив.
 +
 +<code>  :local result [ :toarray "" ];</code>
 +
 +Убрана трансформация в буквенный код дня недели.
 +
 +<code>  :set day ( $day % 7 );</code>
 +
 +=== Убрано ===
 +
 +Этот массив больше не нужен, т.к. отдаем в виде цифры.
 +
 +<code>  :local days {"sat";"sun";"mon";"tue";"wed";"thu";"fri";};</code>
 +
 +==== Код для импорта ====
 +
 +<file rsc day-of-week-and-time.rsc>/system script
 +add comment="\CC\EE\E4\E8\F4\E8\EA\E0\F6\E8\FF, \E2\EE\E7\E2\F0\E0\F9\E0\FE\F9\
 +    \E0\FF \E4\E5\ED\FC \ED\E5\E4\E5\EB\E8 \E8 \E2\F0\E5\EC\FF" \
 +    dont-require-permissions=no name=day-of-week-and-time owner=vasya policy=\
 +    read,write,policy,test source="# Written by Nikolay Soloshin (nikolay@solo\
 +    shin.su) for RouterOS v6.47.8 on hAP (mipsbe) @ 2020.12\r\
 +    \n\r\
 +    \n:global dayAndTime do={\r\
 +    \n  :local date [ /system clock get date ];\r\
 +    \n  :local time [ :tonum [ :pick [ /system clock get time ] 0 2 ] ];\r\
 +    \n\r\
 +    \n  # For test\r\
 +    \n  #:local time [ :tonum 14 ];\r\
 +    \n  #:local date \"mar/01/2009\";\r\
 +    \n\r\
 +    \n  :local day;\r\
 +    \n  :local year;\r\
 +    \n  :local result [ :toarray \"\" ];\r\
 +    \n\r\
 +    \n  :local months {mar=\"3\";apr=\"4\";may=\"5\";jun=\"6\";jul=\"7\";aug=\
 +    \"8\";sep=\"9\";oct=\"10\";nov=\"11\";dec=\"12\";jan=\"13\";feb=\"14\";};\
 +    \r\
 +    \n\r\
 +    \n  :local month ( \$months -> [ :pick \$date 0 3 ] );\r\
 +    \n  :local century [ :pick \$date 7 9 ];\r\
 +    \n\r\
 +    \n  # If the first char is a 0 (zero) only read last char, else script fai\
 +    ls\r\
 +    \n  :if ( [ :pick \$date 4 5 ] = 0 ) do={ :set day [ :pick \$date 5 6 ]; }\
 +    \_else={ :set day [ :pick \$date 4 6 ]; }\r\
 +    \n  :if ( [ :pick \$date 9 10 ] = 0 ) do={ :set year [ :pick \$date 10 11 \
 +    ]; } else={ :set year [ :pick \$date 9 11 ]; }\r\
 +    \n  :if ( [ :pick \$time 0 1 ] = 0 ) do={ :set time [ :pick \$time 0 1 ]; \
 +    }\r\
 +    \n  \r\
 +    \n  # Adjusting the year value for January and February\r\
 +    \n  :if ( \$month = 13 || \$month = 14 ) do={ :set year ( \$year - 1 ); }\
 +    \r\
 +    \n\r\
 +    \n  # Modified Zeller's congruence for software\r\
 +    \n  :set day ( \$day + ( 13 * ( \$month + 1 ) / 5 ) + ( \$century / 4 ) + \
 +    \$year + ( \$year / 4 ) + ( 5 * \$century ) );\r\
 +    \n  :set day ( \$day % 7 );\r\
 +    \n\r\
 +    \n  :set ( \$result -> \"day\" ) \$day;\r\
 +    \n  :set ( \$result -> \"time\" ) \$time;\r\
     \n\r\     \n\r\
     \n  :return \$result;\r\     \n  :return \$result;\r\
Строка 104: Строка 205:
 ===== Пример использования ===== ===== Пример использования =====
  
-Т.к. функция глобальная, после запуска ее можно вызывать из любого другого скрипта или из терминала:+Т.к. функции глобальные, после запуска их можно вызывать из любого другого скрипта или из терминала
 + 
 +Вывод оригинальной функции:
  
 <code>[vasya@Gateos] > :put [ $dayOfWeek ] <code>[vasya@Gateos] > :put [ $dayOfWeek ]
 dec/08/2020 dec/08/2020
 tue</code> tue</code>
 +
 +Вывод модифицированной функции:
 +
 +<code>[vasya@Gateos] > :put [ $dayAndTime ]
 +dec/08/2020
 +18:29:37
 +day=3;time=18</code>
 +
 +//Порядок следования дней недели смотрите [[#days_array|выше]].//
  
 ==== Политики запуска ==== ==== Политики запуска ====
Последнее изменение: 2022/02/12 11:40 (внешнее изменение)