帮忙求解:批处理中日期函数的算法?
下面的是批处理中的一段代码,在网上找到的。具体功能是根据日期返回天数。代码如下::Date2Day<date><return>setlocalENABLEEXTENSIO...
下面的是批处理中的一段代码,在网上找到的。
具体功能是根据日期返回天数。代码如下:
:Date2Day <date> <return>
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (set /a yy=%%a,mm=%%b,dd=%%c)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF
想请教各位BAT的大神们,帮我说明一下算法;特别是如下两行代码:
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
各个数字代表什么意思,又是怎么算出来的,为什么要使用这个数字? 展开
具体功能是根据日期返回天数。代码如下:
:Date2Day <date> <return>
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (set /a yy=%%a,mm=%%b,dd=%%c)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF
想请教各位BAT的大神们,帮我说明一下算法;特别是如下两行代码:
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
各个数字代表什么意思,又是怎么算出来的,为什么要使用这个数字? 展开
3个回答
展开全部
如果是“语法”方面疑惑提出来还能帮你解释一下,至于这里面的“算法”我是没兴趣研究,应该是按每年365日每月或许是按30日,显然需要很多次修正,这样也应该有很多判断或者说有很多逻辑计算,而bat只是叫批处理,编程及计算功能无法与专业编程语言相比,象这样编为“函数”或者研究其“算法” 我认为意义不大。
要进行修正,想象应该有 if 命令, 观此代码却没看到,日常生活中的算法结合计算机特点运用到具体代码中,也许才算是“算法”吧,虽然都是一些不知怎么来的算式和数字,但对代码能如此实现预定功能我并不感到疑惑。bat命令中就set/a可以进行计算,这段代码里除了+ - * / 还用到了%% (即取余) ,强调一下除法是取整的,利用此特点使得能代替if , 举例:
set/a z=14-mm,z/=12
上式的逗号是在一个set/a 命令中依次进行多项计算赋值时的分隔符,这里的mm是之前赋给的月份数, 而z/=12 是z=z/12的简写,上式可以写成
set/a z=(14-mm)/12
这样直观些,这种计算什么意义?因为除法是取整的,mm的合法值是1~12 意味着 当mm是1或2月时取z=1否则取z=0 直接写成代码就是
if %mm% leq 2 (set z=1) else set z=0
猜测一下计算目的:2月之前如要计算至年初的天数对于是否"身怀有闰"是不需考虑的
还有的比如4800怎么来的,还能想象每400年恰要变动一次闰年,有4800个月?显然由代码无法判断它怎么去修正闰的情况,还有更多的算式和出现的数,则连这样猜测都难以做到了, 人家推导归纳出来"修正值"肯定经过了曲折步骤,哪这么容易从结果判断原因哦,看网友是否愿意重复别人的推导和归纳过程?
要进行修正,想象应该有 if 命令, 观此代码却没看到,日常生活中的算法结合计算机特点运用到具体代码中,也许才算是“算法”吧,虽然都是一些不知怎么来的算式和数字,但对代码能如此实现预定功能我并不感到疑惑。bat命令中就set/a可以进行计算,这段代码里除了+ - * / 还用到了%% (即取余) ,强调一下除法是取整的,利用此特点使得能代替if , 举例:
set/a z=14-mm,z/=12
上式的逗号是在一个set/a 命令中依次进行多项计算赋值时的分隔符,这里的mm是之前赋给的月份数, 而z/=12 是z=z/12的简写,上式可以写成
set/a z=(14-mm)/12
这样直观些,这种计算什么意义?因为除法是取整的,mm的合法值是1~12 意味着 当mm是1或2月时取z=1否则取z=0 直接写成代码就是
if %mm% leq 2 (set z=1) else set z=0
猜测一下计算目的:2月之前如要计算至年初的天数对于是否"身怀有闰"是不需考虑的
还有的比如4800怎么来的,还能想象每400年恰要变动一次闰年,有4800个月?显然由代码无法判断它怎么去修正闰的情况,还有更多的算式和出现的数,则连这样猜测都难以做到了, 人家推导归纳出来"修正值"肯定经过了曲折步骤,哪这么容易从结果判断原因哦,看网友是否愿意重复别人的推导和归纳过程?
更多追问追答
追答
呵呵,请不要把批处理和编程语言同样去研究编程或算法,算法是与语言种类无关但还要它的代码实现得了。批处理的优势在于利用现有系统命令来执行一批命令,不用再装软件只是简单编写后也不用编译什么的直接运行,而编程则是很多代码最终相当于形成一个新命令---有必要系统研究其算法的优劣。如果你的目的就是从这段批处理代码来研究其算法是否最优,甚至借鉴以用于其他语言的编程中,把它的代码翻译成公式就是算法了,至于验证我是不感兴趣,要说这段里面一些数的含义,至少那个14是知道是为什么,但是仅从代码完全知道它的算法根据是不现实的,只能从本该怎么计算和修正着手,好比数学代数式的化简,原式看起来很繁但却接近实际问题的描述,化简式很方便计算,却看不出式中的算式及常数系数是否能正确计算该实际问题
展开全部
建议到批处理之家提问这类问题,那里高手如云。
追问
你的建议很好,只不过欠缺个地址,不过地址为知道,只是为了方便其他人看到,可以根据你的建议也能找到问题解决的地方。
追答
我不知道你的追问是什么意思(看不太懂,理解力有限)
我把批处理之家的地址贴给你,如果你需要,你就去看看。
http://bathome.l3.wuyou.com/index.php
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
返回天数?返回的是什么天数,从那一天开始算
不说清楚,怎么分析这个bat
不说清楚,怎么分析这个bat
追问
你自己看不懂吗?如果你不能看懂这个程序,那你如何谈起这个程序的算法啊?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询