原帖由 zc584267913 于 2010-5-10 15:58 发表
可能是小弟太愚钝了,最终还是没有计算出来下面这句的值,求详细计算过程,已2010-05-10号为例
set/a "T=^!(M-2)","R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)","C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","D=T*(28+R)+C*30+(^!T&^!C)*31+D")
你没弄懂的是其他部分的代码:
@echo off&setlocal enabledelayedexpansion关闭回显,不显示本行已经开启变量延迟
for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do (
set Y=%%a&set M=%%b&set D=%%c
if "!M:~0,1!"=="0" set M=!M:~1!
if "!D:~0,1!"=="0" set D=!D:~1!
)
上面是获取年、月和日,分别赋值给Y、M和N。
set/a D-=1
将日期减1就是昨天的日期,但有一个例外,那就是如果今天是1号,那么D为0。实际昨天应该是上个月的月末,实际数字就是上个月的天数。所以下面的代码是用来处理这个特例的,也就是计算上个月的天数。
if %D% leq 0
处理D为0的情况,也可以直接写成if %D%==0,这里使用 leq 是为了方便计算前、大前天时,就只需要改set/a D-=1就可以了。
set/a M-=1
当D为0时,需要获取上个月的月份
if !M!==0 set/a Y-=1,M=12
如果M为0则,年为去年,月份为12
set/a "T=^!(M-2)","R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)","C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","D=T*(28+R)+C*30+(^!T&^!C)*31+D"
获取上个月的某个日期,D为0时即获取月份的天数(月末的日期)。
set M=0%M%&set D=0%D%
为月和日前面加0
echo.昨天是%Y%年%M:~-2%月%D:~-2%日
显示年月日,并截取月和日的后两位数字。
注意,不要认为变量名相同,就认为他代表的意思相同!
set/a "T=^!(M-2)","R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)","C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","D=T*(28+R)+C*30+(^!T&^!C)*31+D"
重点说下这个:
这个是在D为0时的代码,所以"D=T*(28+R)+C*30+(^!T&^!C)*31+D"可以直接写成"D=T*(28+R)+C*30+(^!T&^!C)*31"。这里之所以加上这个D,是为了方便代码改成计算前天、大前天的日期。
"T=^!(M-2)"如果月份为2,则T为1,其他时候为0
"R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)"闰年时为1,非闰年是为0
"C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)"如果月份为小月(30天的月份),则C为1,其他时候,包括大月(31天)和2月时,为0
"D=T*(28+R)+C*30+(^!T&^!C)*31"获取月份的天数,其中(^!T&^!C)如果月份为非小月,也非2月,实际就是大月的时候,此结果为1。
现在以2010年5月为例:
set/a "T=^!(M-2)",M减2为3,!的作用是对3取非,即0时为1,非0时为0,所以T为0,T只有在M为2时才为1。
set/a "R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)",Y为2010,R为0。
set/a "C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)",只有当M为4或6或9或11时,C为1,其他时候如M为1、2、3、5、7、8、10和12时,C为0,所以此时C为0
set/a "D=T*(28+R)+C*30+(^!T&^!C)*31+D",因为T为0,C为0,所以(^!T&^!C)为1,所以这个算式就是set/a "D=0*(28+0)+0*30+1*31+0",结果31。
如果要获取某个月,如当月的天数,可以这样写:- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=-:/ " %%a in ("%date%") do (
- set M=%%b&if "!M:~0,1!"=="0" set M=!M:~1!
- set/a "C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","E=^!(M-2)*(28+(^!(%%a%%4)&^!^!(%%a%%100))|^!(%%a%%400))+C*30+(^!^!(M-2)&^!C)*31"
- )
- echo.%E%&pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-5-10 17:13 编辑 ] |