Скрипт получения необходимого времени

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

При написании серии скриптов столкнулся с необходимостью отсрочить первый запуск шедулера на некоторое время, а в дальнейшем запускать его с малым периодом. В результате сотрудничества с челом с ником Illinory (ник не местный, просто это его визитка, чел плотно сидел в WOW, выдавал неплохие результаты, под ним его знают многие) родился маленький такой кусочек кода, позволяющий получить время для подстановки в соответствующие поля.

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

#1. Задаём переменную для разделителя (у меня формат времени хх:хх:хх, поэтому разделитель - двоеточие).
:local Mysymbol ":";
#2. Извлекаем два первых символа из значения времени и производим необходимую операцию (в моём случае я прибавил единицу, т. е. увеличил время на час).
:local MyTime1 ([:pick [/system clock get time] 0 2]+1);
#3. Извлекаем остальные символы из времени
:local MyTime2 [:pick [/system clock get time] 3 8];
#4. Пишем условие, которое не даёт превратить в дальнейшем преобразовании 24 часа в 1 день (может получится как результат сложения 23 часа + 1).
:if ($MyTime1="24")  do={ :set MyTime1 "00";};
#5. Наконец, назначаем глобальную переменную и обращаем простое числовое выражение с разделителями (получается после сложения) во время.
#Эта переменная и будет использоваться в других скриптах.
:global TimePlus  [:totime ($MyTime1.$Mysymbol.$MyTime2)];
#6. Логи, при отладке раскоментировать, по ним легче разобраться, на каком этапе идет сбой.
#:log info $MyTime1;
#:log info $MyTime2;
#:log info $TimePlus;


Естественно, при других дельтах времени придется писать другие условия, но хоть будет с чего стартовать.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

После нескольких недель обкатки новая версия скрипта, позволяет получить время в качестве переменной. Нужен, если есть необходимость изменять время запуска шедулера (мне лично), ну если кто-то еще куда прикрутит, буду рад услышать, где использовали.

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

#Символ разделителя времени
:local Mysymbol ":";
#Изменение времени (максимум 23 часа 59 минут 59 секунд). Если надо отнять, делаем значение переменной отрицательным
:local deltaH ;
:local deltaM ;
:local deltaS ;
#Время два  символа и прибавить к ним изменение
:local MyTime1 ([:pick [/system clock get time] 0 2]+$deltaH);
:local MyTime2 ([:pick [/system clock get time] 3 5]+$deltaM);
:local MyTime3 ([:pick [/system clock get time] 6 8]+$deltaS);
#Условие
:if ($MyTime3>="60")  do={ :set MyTime3 ($MyTime3 - 60); :set MyTime2 ($MyTime2 + 1);} else={:if ($MyTime3<"0") do={ :set MyTime3 ($MyTime3 + 60); :set MyTime2 ($MyTime2 + 1);}};
:if ($MyTime2>="60")  do={ :set MyTime2 ($MyTime2 - 60); :set MyTime1 ($MyTime1 + 1);} else={:if ($MyTime2<"0") do={ :set MyTime2 ($MyTime2 + 60); :set MyTime1 ($MyTime1 - 1);}};
:if ($MyTime1>="24")  do={ :set MyTime1 ($MyTime1 - 24)} else={:if ($MyTime1<"0") do={ :set MyTime1 ($MyTime1 + 24)}};
#Получаем значение текущего времени плюс $delta
:local DeltaPlus  [:totime ($MyTime1.$Mysymbol.$MyTime2.$Mysymbol.$MyTime3)];
:log info $MyTime1;
:log info $MyTime2;
:log info $MyTime3;
:log info $DeltaPlus;

Логи в конце проставлены просто для проверки работоспособности скрипта на всех ключевых этапах. При использовании скрипта закоментировать. Переменным $delta* присваиваем значение, на которое нужно изменять стартовое время. $deltaH - это часы, $deltaM - минуты и $deltaS - секунды. Ну и переменная $DeltaPlus, конечно, нужна не локальная, если используем в других скриптах.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Jav
Сообщения: 10
Зарегистрирован: 19 ноя 2019, 17:30

Спасибо, уважаемый podarok66!
Логика ясна! Понятно, что во вторая версия скрипта это demo пример, но смею уточнить пару деталей:

Теоретически, в момент работы скрипта время может измениться. Маловероятно, но может. Например, "23:59:59" станет "00:00:00" и в обработку может попасть некорректное "23:00:00" с непредсказуемым результатом. Что бы обойти такую ситуацию надо сначала сохранить время в переменную, а потом уже его обрабатывать.

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

:local TimeA [/system clock get time];
:local MyTime1 ([:pick $TimeA 0 2]+$deltaH);
:local MyTime2 ([:pick $TimeA 3 5]+$deltaM);
:local MyTime3 ([:pick $TimeA 6 8]+$deltaS);
И мне кажется, допущена неточность в 12 строчке со знаком +/- . Правильно будет поставить '($MyTime2 - 1);}}'. Например, уменьшение "00:00:00" на 5 сек. давало неверный результат.

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

#Условие
:if ($MyTime3>="60")  do={ :set MyTime3 ($MyTime3 - 60); :set MyTime2 ($MyTime2 + 1);} else={:if ($MyTime3<"0") do={ :set MyTime3 ($MyTime3 + 60); :set MyTime2 ($MyTime2 - 1);}};
Аналогично можно обработать и переход через полночь (смену суток).


Давайте жить дружно!
MikroTik RB951G-2HnD
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Признаться, я с трудом могу даже вспомнить обстоятельства, заставившие заниматься этим скриптом. Тем более, что часть кода не моя, я об этом писал. Если нашли ошибку, исправляйте, тестируйте, публикуйте конечный результат. Я не против. Если я что-то выложил в свободный доступ, значит я не против любых изменений.
Заметьте, нигде в скриптах я не указываю авторство. Это моя принципиальная позиция. Как старый пират, я люблю халяву и всеми силами множу то, что могу сделать безнаказанно. Но как человек, активно использующий лицензии, я стараюсь не задевать своей деятельностью интересы тех, кто зарабатывает на жизнь кодингом и программированием. На лицо конфликт интересов :-) Но такова уж моя противоречивая натура.
Ну и по поводу ошибки в коде. Ну не помню я его. От слова совсем. Простите, но так уж получилось. :nez-nayu:
Хотя, я тут посмотрел свежим взглядом. Да, всё верно. Все замечания по делу. Ну так и это не скрипт, а набросок для любопытных. Но в целом спасибо, я поправлю тело скрипта. Вот так получается

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

#Символ разделителя времени
:local Mysymbol ":";
#Изменение времени (максимум 23 часа 59 минут 59 секунд). Если надо отнять, делаем значение переменной отрицательным
:local deltaH ;
:local deltaM ;
:local deltaS ;
#Берём время роутера
:local TimeA [/system clock get time];
#Время два  символа и прибавить к ним изменение
#Часы
:local MyTime1 ([:pick $TimeA 0 2]+$deltaH);
#Минуты
:local MyTime2 ([:pick $TimeA 3 5]+$deltaM);
#Секунды
:local MyTime3 ([:pick $TimeA 6 8]+$deltaS);
#Условие
#Если секунды получились больше 60, уменьшаем на 60, к минутам прибавляем 1. Если секунды меньше нуля, прибавляем 60 и отнимаем 1 от минут
:if ($MyTime3>="60")  do={ :set MyTime3 ($MyTime3 - 60); :set MyTime2 ($MyTime2 + 1);} else={:if ($MyTime3<"0") do={ :set MyTime3 ($MyTime3 + 60); :set MyTime2 ($MyTime2 - 1);}};
#Если минуты получились больше 60, уменьшаем на 60, к часам прибавляем 1. Если минуты меньше нуля, прибавляем 60 и отнимаем 1 от часов
:if ($MyTime2>="60")  do={ :set MyTime2 ($MyTime2 - 60); :set MyTime1 ($MyTime1 + 1);} else={:if ($MyTime2<"0") do={ :set MyTime2 ($MyTime2 + 60); :set MyTime1 ($MyTime1 - 1);}};
#Если часы получились больше 24, уменьшаем на 24 Если часы меньше нуля, прибавляем 24
:if ($MyTime1>="24")  do={ :set MyTime1 ($MyTime1 - 24)} else={:if ($MyTime1<"0") do={ :set MyTime1 ($MyTime1 + 24)}};
#Получаем значение текущего времени плюс $delta
:local DeltaPlus  [:totime ($MyTime1.$Mysymbol.$MyTime2.$Mysymbol.$MyTime3)];
:put info $MyTime1;
:put info $MyTime2;
:put info $MyTime3;
:put info $DeltaPlus;
Ну а уж обходить заявленный вам момент, когда в момент отработки скрипта случится полночь - пусть это обсасывают те, кто решится засовывать эту муру куда-нибудь в скрипт ;;-))) Мне нужно было такое лишь разок, да и то не очень долго. И там Illinory что-то дописывал. Сейчас уж и не вспомнить. Может он и поправил то, что вы упомянули. Во всяком случае сейчас этот код точно нигде и никак не используется.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
Gatarios
Сообщения: 11
Зарегистрирован: 23 фев 2022, 17:41
Откуда: Хабаровск
Контактная информация:

Добрый день. А вот скрипт получения времени мне пригодился. Я его немного переделал для использования в других всевозможных скриптах:

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

:local Mysymbol ":";
:local deltaH ;
:local deltaM ;
:local deltaS ;
:local TimeA [/system clock get time];
:global TimeH ([:pick $TimeA 0 2]+$deltaH);
:global TimeM ([:pick $TimeA 3 5]+$deltaM);
:global TimeS ([:pick $TimeA 6 8]+$deltaS);
:if ($TimeS>="60")  do={ :set TimeS ($TimeS - 60); :set TimeM ($TimeM + 1);} else={:if ($TimeS<"0") do={ :set TimeS ($TimeS + 60); :set TimeM ($TimeM - 1);}};
:if ($TimeM>="60")  do={ :set TimeM ($TimeM - 60); :set TimeH ($TimeH + 1);} else={:if ($TimeM<"0") do={ :set TimeM ($TimeM + 60); :set TimeH ($TimeH - 1);}};
:if ($TimeH>="24")  do={ :set TimeH ($TimeH - 24)} else={:if ($TimeH<"0") do={ :set TimeH ($TimeH + 24)}};
:global DeltaPlus  [:totime ($TimeH.$Mysymbol.$TimeM.$Mysymbol.$TimeS)];
Таким образом можно его поместить в планировщик заданий (шедулер) на выполнение каждую секунду к примеру, и получать актуальные значения часа ($TimeH), минут ($TimeM) и секунд ($TimeS) в любых скриптах. Ну и оставил на всякий случай общее время ($DeltaPlus).

Спасибо podarok66, Jav и Illinory за предоставленный материал.

Конкретно у меня этот скрипт используется при запуске компа. Дело в том, что когда мой телефон подключен к WiFi, то мой комп запускается микротом, а теперь при условии времени ночью я могу выключить комп и не отключать свой телефон от WiFi


Если так принято, то вот
Дом:
x86, C52iG, RB911G, RB951G, RB951Ui, RBD52G, RB952Ui, RB941, Woobm-USB

На работе:
RB3011UiAS, RB951G
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Да на здоровье ))) Illinory я передам при разговоре. :-)


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить