Узнать дату

Обсуждение ПО и его настройки
Ответить
svetkin
Сообщения: 24
Зарегистрирован: 19 янв 2014, 12:31

Всем добрый день!

Подскажите, как в скрипте узнать какой сегодня день недели?

и вообще где можно посмотреть какие системные функции можно использовать?


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

http://wiki.mikrotik.com/wiki/Script_to ... f_the_week
Или поновее

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

#
#   $RCSfile: function-date.rsc,v $
#   $Revision: 1.1 $
#   $Date: 2011/05/27 19:47:46 $
#   $Author: reesejb $, iNet Specialists. Copyright, (C)2007-2011, All Rights Reserved
#
#   Calculates day of the week (number of month, etc.) for a givien date
#
#   Expanded from "day of week" script at:
#      http://wiki.mikrotik.com/wiki/Script_to_find_the_day_of_the_week
#   
#   Month: jan,feb,..nov,dec   (must be lower-case)
#   Day: 01-31
#   Year: 1900-2999
#   mmm/dd/yyyy   same format as [/system clock get date]
#   (ex. jul/22/2009)
 
:local date [/ system clock get date]
 
# Variables
:global weekday ""
:global monthord ""
:local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"]
:local monthval [:toarray "01,02,03,04,05,06,07,08,09,10,11,12"]
:local monthtbl [:toarray "0,3,3,6,1,4,6,2,5,0,3,5"]
:local daytbl [:toarray "sun,mon,tue,wed,thu,fri,sat"]
 
:global monthshort [:pick $date 0 3]
:global day [:pick $date 4 6]
:local daysum $day
:local dayc [:pick $date 5 6]
:global century [:pick $date 7 9]
:global year [:pick $date 9 11]
:local yearsum $year
:local yearc [:pick $date 10 11]
 
# if the first digit of the day or year is a 0 (zero),
# only use the last digit, otherwise the script will fail
:if ([:pick $date 4 5] = 0) do={ :set daysum ($dayc)}
:if ([:pick $date 9 10] = 0) do=[:set yearsum ($yearc)]
 
# Calculate "sum" to determine which "day of week" (from daytbl) to use
:local sum 0
:set sum ($sum + (2 * (3 - ($century - (($century / 4) * 4)))))
:set sum ($sum + ($yearsum / 4))
:set sum ($sum + $yearsum + $daysum)
:for mindex from=0 to=[:len $months] do={ \
   :if ([:pick $months $mindex] = $monthshort) do={ \
      :set sum ($sum + [:pick $monthtbl $mindex])
      :set monthord [:pick $monthval $mindex]
      } \
   }
:set sum ($sum - (($sum / 7) * 7))
:set weekday [:pick $daytbl $sum]
 
# Log the result for troubleshooting purposes
:log info "Today is $weekday, $monthshort $day, $century$year ($monthord/$day/$century$year)"

http://wiki.mikrotik.com/wiki/Manual:Scripting


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

Здравствуйте, подскажите, что-то изменилось в новых прошивках??
До этого стояли версии 7.7 - 7.8 на роутерах этот скрипт срабатывал нормально. Сейчас некорректно определяет день недели и выдает: "Today is sun, 202 -0, -29 (/-0/-29)".
Версия 7.10 и выше


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

Там формат даты поменяли. Что там и как не могу сказать, я последнюю версию не юзаю. Как-то старых возможностей хватает, мне обновлять оборудование пока не очень хочется.


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

Да, действительно, изменили вывод формата даты с версии 7.10 RouterOS
*) console - changed time format according to ISO standard;
Было:
mmm/dd/yyyy
Стало:
yyyy-mm-dd.


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

Да, старый вывод выглядит так
jul/30/2023
Новый так
2023-07-30
Надо скрипт пересобрать, основываясь на этом. Может кто-то и сподобится. Большинство моих знакомых очень неохотно хотят обновлений (ой, странное выражение, но оставлю, мне нравится. Вся суть в нём). Все сидят на 6 версии. Illinory вообще категорично отзывается о таком шаге. Ему там, если что, переписывать не одну неделю. А вот такие неожиданные изменения формата выдачи посреди релиза свободно могут поломать то, что давно и успешно работало. Если вам надо, попробуйте сами переписать


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

Один умелец на официальном форуме уже попробовал написать скрипт выдергивания даты, времени и пр. из под существующей версии 7.10 +

 Упрощенная версия

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

:global simplercurrdatetimestr do={
    /system clock
    :local vdate [get date]
    :local vtime [get time]
    :local vdoff [:toarray "0,4,5,7,8,10"]
    :local MM    [:pick $vdate ($vdoff->2) ($vdoff->3)]
    :local M     [:tonum $MM]
    :if ($vdate ~ ".../../....") do={
        :set vdoff [:toarray "7,11,1,3,4,6"]
        :set M     ([:find "xxanebarprayunulugepctovecANEBARPRAYUNULUGEPCTOVEC" [:pick $vdate ($vdoff->2) ($vdoff->3)] -1] / 2)
        :if ($M>12) do={:set M ($M - 12)}
        :set MM    [:pick (100 + $M) 1 3]
    }
    :local yyyy [:pick $vdate ($vdoff->0) ($vdoff->1)]
    :local dd   [:pick $vdate ($vdoff->4) ($vdoff->5)]
    :local HH   [:pick $vtime 0  2]
    :local mm   [:pick $vtime 3  5]
    :local ss   [:pick $vtime 6  8]

    :return "$yyyy-$MM-$dd $HH:$mm:$ss"
}

:put [$simplercurrdatetimestr]
 Полный вариант

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

:global currdatetimestr do={
    /system clock
    :local vdate [get date]
    :local vtime [get time]
    :local vgmt  [:tonum [get gmt-offset]]; :if ($vgmt > 0x7FFFFFFF) do={:set vgmt ($vgmt - 0x100000000)}
    :local prMntDays [:toarray "0,0,31,59,90,120,151,181,212,243,273,304,334"]
    :local daysOnMnt [:toarray "0,31,28,31,30,31,30,31,31,30,31,30,31"]
    :local LcaseMnts [:toarray "0,jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"]
    :local PcaseMnts [:toarray "0,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"]
    :local UcaseMnts [:toarray "0,JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"]
    :local LcaseWeekDays [:toarray "thu,fri,sat,sun,mon,tue,wed"]
    :local PcaseWeekDays [:toarray "Thu,Fri,Sat,Sun,Mon,Tue,Wed"]
    :local UcaseWeekDays [:toarray "THU,FRI,SAT,SUN,MON,TUE,WED"]
    :local NumbrWeekDays [:toarray "4,5,6,7,1,2,3"]
    :local Fzerofill do={:return [:pick (100 + $1) 1 3]}
    :local gmtSg "+"; :if ($vgmt < 0) do={:set gmtSg "-"; :set vgmt ($vgmt * -1)}
    :local gmtHr [:pick [:totime $vgmt] 0 2]
    :local gmtMn [:pick [:totime $vgmt] 3 5]
    :local vdoff [:toarray "0,4,5,7,8,10"]
    :local MM    [:pick $vdate ($vdoff->2) ($vdoff->3)]
    :local M     [:tonum $MM]
    :if ($vdate ~ ".../../....") do={
        :set vdoff [:toarray "7,11,1,3,4,6"]
        :set M     ([:find "xxanebarprayunulugepctovecANEBARPRAYUNULUGEPCTOVEC" [:pick $vdate ($vdoff->2) ($vdoff->3)] -1] / 2)
        :if ($M>12) do={:set M ($M - 12)}
        :set MM    [:pick (100 + $M) 1 3]
    }
    :local yyyy [:pick $vdate ($vdoff->0) ($vdoff->1)]
    :local Leap "No-Leap"
    :if ((($yyyy - 1968) % 4) = 0) do={:set Leap "Leap"; :set ($prMntDays->1) -1; :set ($prMntDays->2) 30; :set ($daysOnMnt->2) 29}
    :local mmm  ($LcaseMnts->$M)
    :local Mmm  ($PcaseMnts->$M)
    :local MMM  ($UcaseMnts->$M)
    :local MD   ($daysOnMnt->$M)
    :local dd   [:pick $vdate ($vdoff->4) ($vdoff->5)]
    :local d    [:tonum $dd] ; :local totd ((($yyyy - 1970) * 365) + (($yyyy - 1968) / 4) + ($prMntDays->$M) + ($d - 1))
    :local YD   (($prMntDays->$M) + $d)
    :local www  ($LcaseWeekDays->($totd % 7))
    :local Www  ($PcaseWeekDays->($totd % 7))
    :local WWW  ($UcaseWeekDays->($totd % 7))
    :local WD   ($NumbrWeekDays->($totd % 7))
    :local HH   [:pick $vtime 0  2]
    :local H    [:tonum $HH]
    :local hh   ([:tonum $HH] % 12); :if ($hh = 0) do={:set hh 12}; :set hh [$Fzerofill $hh]
    :local h    [:tonum $hh]
    :local a    "A"; :if ([:tonum $HH] > 11) do={:set a "P"}
    :local aa   "$a\4D"
    :local mm   [:pick $vtime 3  5]
    :local m    [:tonum $mm]
    :local ss   [:pick $vtime 6  8]
    :local s    [:tonum $ss]
    :local Z    "$gmtSg$gmtHr:$gmtMn"
    :local Unix (((((($totd * 24) + $H) * 60) + $m) * 60) + $s - $vgmt)
    :return "$yyyy-$MM-$dd\54$HH:$mm:$ss$Z $Www (YD: $YD) (MD: $MD) (WD: $WD) $Leap $Unix"
}

:put [$currdatetimestr]
 Пояснение
$yyyy current year full number ex. 2022

$MM current month number with 0 ex. 01,02,03...10,11,12
$M current month number without 0 ex. 1,2,3...10,11,12

$MMM current short mont name UPPERCASE JAN,FEB...NOV,DIC
$Mmm current short mont name Propercase Jan,Feb...Nov,Dic (not standard)
$mmm current short mont name lowercase jan,feb...nov,dic (not standard)
$MD it indicates how many days a month is made up of

$dd current day number with 0 ex. 01,02,03...29,30,31
$d current day number without 0 ex. 1,2,3...29,30,31
$YD current day number of the year 1...365/366

$WWW current short day of week name UPPERCASE THU,FRI,SAT,SUN,MON,TUE,WED
$Www current short day of week name Propercase Thu,Fri,Sat,Sun,Mon,Tue,Wed (not standard)
$www current short day of week name lowercase thu,fri,sat,sun,mon,tue,wed (not standard)
$WD current day of week number from 1 (mon) to 7 (sun)

$HH current hour number 24h format with 0 ex. 00,01,02...21,22,23
$H current hour number 24h format without 0 ex. 0,1,2...21,22,23

$hh current hour number 12h format with 0 ex. 01,02,03...10,11,12
$h current hour number 12h format without 0 ex. 1,2,3...10,11,12

$aa current AM / PM symbol for 12h format ex. AM or PM
$a current first letter only of AM / PM symbol for 12h format ex. A or P

$mm current minute number with 0 ex. 00,01,02...57,58,59
$m current minute number without 0 ex. 0,1,2...57,58,59

$ss current second number with 0 ex. 00,01,02...57,58,59(,60?)
$s current second number without 0 ex. 0,1,2...57,58,59(,60?)

$Z current Time Zone offset ex. -23:59...+00:00...+23:59

$Leap if the current year is leap year (Leap) or not (No-Leap)

$Unix Epoch Unix Time

If desired, Lcase, Pcase and Ucase arrays can be localized, but only keeping English letters, uppercase or lowercase, from A to Z.

В терминале работает корректно, но почему-то через скрипт или через планировщик не срабатывает.
То ли лыжи не едут, то ли....


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Лыжи едут. Замените в скриптах :put на :log info и получите вывод в скриптах и Планировщике.
Умелец
этот вероятно Rextended (по стилю видно), не стоит его так называть, он очень сильный программист.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
cloystix
Сообщения: 7
Зарегистрирован: 26 июл 2020, 20:29

Sertik писал(а): 31 июл 2023, 13:24 Лыжи едут. Замените в скриптах :put на :log info и получите вывод в скриптах и Планировщике.
Умелец
этот вероятно Rextended (по стилю видно), не стоит его так называть, он очень сильный программист.
Делал например: :log info "Today is $Www" в конце скрипта. Может где ошибся вчера, перепроверю.
Да, вы абсолютно правы, его код. Умелец - без никакого злого умысла тут. Не сомневаюсь в его знаниях, он единственный, кто перелопатил и предоставил адаптированный вариант скрипта на данный момент.


Ответить