Dates manipulation in ROS (арфиметика дат)

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

Например, отключить Интернет пользователю через 28 дней. Вроде бы просто.

Но не совсем…

К сожалению, ROS имеет очень ограниченную поддержку работы с датами.

А если честно – то почти никакой.

К примеру, даже сравнение дат в формате “jan/01/2017” – уже не такая простая задача. Ибо по умолчанию ROS сравнит строки, что в данном случае некорректно.

Для сравнения дат я уже писал простейшие функции (см. работу с датами бэкапов в Scripting: how to find last backup (part 2) ).

Но вот что делать, если нам нужно найти число дней между датами или же определить, какая дата будет через указанное число дней?

В результате обсуждения данного вопроса на форуме и родился модуль рыботы с датами.

Для простоты всё оформлено в виде функций.

Для использования данного модуля Вам нужно:

А) скопировать его на роутер (предварительно распаковав). Последняя версия находится тут. Либо прямой линк на актуальную на данный момент версию – dates-v1.1.rsc_.zip

Б) импортировать:

/import dates-v1.1.rsc

В результате у вас должны появиться следующие скрипты:

Самый последний скрипт – тестирует все остальные, а также показывает, как данный модуль может быть использован в ваших скриптах.

Выполните его из терминала:

/system script run test_dates

Если в конце вывода увидели “*** END ***” – значит всё ок, скрипты вызываются и даже работают.

К сожалению, времени на полный тестинг не было – так что если заметите какие-то странности – прошу сообщать тут или на форуме.

Для использования функций внутри вашего скрипта нужно:

  • импортировать/подключить нужную внешнюю функцию;
  • вызвать внешнюю функцию с нужными параметрами.

Например, для вычисления 256-го дня в году, необходимо добавить 255 к 1-му января:

:local shiftDate [:parse [/system script get func_shiftDate source]]
:local year 2017
:local date “jan/01/$year”
:local res [$shiftDate date=$date days=255]
:put “Developers day in $year is $res”

Правильный результат 13-е сентября.

А в 2016-м году?