|
楼主 |
发表于 2007-12-8 09:23:44
|
显示全部楼层
今天发现一个错误,今天(2007-12-08)的星期数算出来居然是错误的
一步一步的排查,发现 tonum命令有bug, (或者是我的用法不对?)
发现有时tonum得不到正确结果
在控制台做如下测试
Terminal vt102 detected, using multiline input mode
[admin@MikroTik] > :put [:tonum "01"]
1
[admin@MikroTik] > :put [:tonum "02"]
2
[admin@MikroTik] > :put [:tonum "03"]
3
[admin@MikroTik] > :put [:tonum "04"]
4
[admin@MikroTik] > :put [:tonum "05"]
5
[admin@MikroTik] > :put [:tonum "06"]
6
[admin@MikroTik] > :put [:tonum "07"]
7
[admin@MikroTik] > :put [:tonum "08"]
[admin@MikroTik] > :put [:tonum "09"]
[admin@MikroTik] > :put [:tonum "10"]
10
[admin@MikroTik] >
发现"08" "09"两个得不到结果
为避免这个错误,就对原来的代码进行一点改进,把前面的0去掉再转换
原来的
:set DD [:tonum([:pick $tmp 4 6])]
改为
:set s [:pick $tmp 4 6]
:if([:find $s "0"]=0) do={:set s [:pick $s 1 [:len $s]]}
:set DD [:tonum($s)]
结果纠正了该错误
完整的代码为:
##############################################################
#脚本名称:week #
#脚本功能:计算当前日期是星期几 #
#脚本用法:在其他脚本中运行/sys scr run week #
# :delay 1s #
# 然后用变量$WEEK取得计算结果,0为星期天 #
#脚本作者:hcb #
#创建日期:2007-11-30 #
##############################################################
:global WEEK 0
#-------------------------------------------------------
#取当前日期,变成数字YY(年),MM(月),DD(日)
:set str (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec)
:set tmp [/sys clock get date]
:set YY [:tonum([:pick $tmp 7 11])]
:set s [:pick $tmp 4 6]
:if([:find $s "0"]=0) do={:set s [:pick $s 1 [:len $s]]}
:set DD [:tonum($s)]
:set n 1
:set MM $n
:set s [:pick $tmp 0 3]
:foreach i in=$str do={
:if($s=$i) do={:set MM $n}
:set n ($n + 1)
}
#------------------------------------------------------
#以2000年1月1日星期6为基准,
#计算2000年1月1日到现在经过了多少天
#基准年
:set y1 2000
#基准年1月1日是星期几
:set w1 6
#基准初始天数,即星期几-1
:set day ($w1 - 1)
#计算到现在的总天数
:set d 0
:for y from=$y1 to=$YY do={
:set m2 12
:if($y=$YY) do={:set m2 $MM}
:for m from=1 to=$m2 do={
:set temp "若是本月,则该月取现在天数,本行是注释"
:if($m=$m2) do={:set d $DD}\
else={
:set temp "若是2月,要考虑平月闰月,本行是注释"
:if($m=2) do={
:set temp "润年是四年一润,本行是注释"
:if($y -($y/4)*4=0) do={:set d 29} else={:set d 28}
}
:if($m!=2) do={
:set tmp "若是小月,则该月天数为30天,否则是31天,本行是注释"
:if($m=4||$m=6||$m=9||$m=11) do={:set d 30} else={:set d 31}
}
}
:set tmp "总天数加该月天数,本行是注释"
:set day ($day + $d)
}
}
#----------------------------------------------------------
#计算总天数除以7的余数就是星期几
#这是一个特殊的算法,由于ROS没有求余的运算,又不支持小数,故如此
:set WEEK ($day -($day/7)*7)
[ 本帖最后由 hcb 于 2007-12-8 09:27 编辑 ] |
|