Board logo

标题: [数值计算] [已解决]批处理计算日期时赋值变量怎么调用? [打印本页]

作者: hucuibai    时间: 2011-1-7 15:59     标题: [已解决]批处理计算日期时赋值变量怎么调用?

  1. @echo
  2. setlocal enabledelayedexpansion
  3. set /a day=%date:~5,2%%date:~8,2%
  4. set /a month=%date:~5,2%%%100
  5. set days=0101,0201,0301,0401,0501,0601,0701,0801,0901,1001,1101,1201
  6. set yesterdays=1231,0131,0228,0331,0430,0531,0630,0731,0831,0930,1031,1130
  7. for /f "tokens=%month% delims=," %%i in ("%days%") do (
  8. if %day%==%%i (for /f "tokens=%month% delims=," %%a in ("%yesterdays%") do (set /a date=%date:~0,4%%%a)) else (set /a date=%date:~0,4%%date:~5,2%%date:~8,2% ))
  9. echo %date%
  10. pause
复制代码
下面for循环引用day不对了!!我找不出原因!!

[ 本帖最后由 hucuibai 于 2011-1-12 17:24 编辑 ]
作者: hucuibai    时间: 2011-1-7 16:15

怎么没人帮忙看看!!
作者: tmplinshi    时间: 2011-1-7 16:23

这段代码执行没有错误,而你又没有说明你要进行什么操作,大家如何帮你?
作者: hucuibai    时间: 2011-1-7 16:29     标题: 回复 3楼 的帖子

运行是可以!我就是想做一个取日期的操作!我以前用的
  1. set /a date=%date:~0,4%%date:~5,2%%date:~8,2%-1
  2. set date=%date:~0,8%
复制代码
用这个来取日期就是月初第一天的前一天 也就是一个月的最后一天取不到!所以我就想了这个比较笨的方法
这个运行是没问题  但是 下面for循环调用day变量就出错了!我是新手,搞不懂为什么,所有上来求教高手!
作者: hanyeguxing    时间: 2011-1-7 16:47

要求%date%必须形如2011-01-07。
某个月天数的计算:
  1. @echo off
  2. set/a Y=%date:~0,4%,M=1%date:~5,2%%%100,"C=!(M-4)|!(M-6)|!(M-9)|!(M-11)","E=!(M-2)*(28+!(Y%%4))+C*30+(!!(M-2)&!C)*31"
  3. echo %Y%年%M%月有%E%天
  4. pause
复制代码
上个月的最后一天的获取:
  1. @echo off
  2. set/a M=1%date:~5,2%%%100-1,Y=%date:~0,4%-!M,M+=!M*12,"C=!(M-4)|!(M-6)|!(M-9)|!(M-11)","E=!(M-2)*(28+!(Y%%4))+C*30+(!!(M-2)&!C)*31"
  3. set M=0%M%
  4. echo 今天的日期:%date:~0,10%
  5. echo 上个月的最后一天是:%Y%-%M:~-2%-%E%
  6. pause
复制代码
一天前的日期:
  1. @echo off
  2. set/a D=1%date:~8,2%%%100-1,M=1%date:~5,2%%%100-!D,Y=%date:~0,4%-!M,M+=!M*12,"C=!(M-4)|!(M-6)|!(M-9)|!(M-11)","D+=!D*(!(M-2)*(28+!(Y%%4))+C*30+(!!(M-2)&!C)*31)"
  3. set M=0%M%&set D=0%D%
  4. echo 今天的日期:%date:~0,10%
  5. echo 一天前的日期:%Y%-%M:~-2%-%D:~-2%
  6. pause
复制代码
对于以上代码,如果限定年份为1901以前也包括,则可以把 !(Y%%4) 改成!(Y%%4)&!!(Y%%100))|!(Y%%400) 。

[ 本帖最后由 hanyeguxing 于 2011-1-7 18:20 编辑 ]
作者: hucuibai    时间: 2011-1-7 16:51     标题: 回复 5楼 的帖子

孤星同志!你这个是取的本月的最后一天吧!我是要求取前一天!也就是上个月的最后一天!而不是本月的!你这个好像我还看不太懂!!
作者: hucuibai    时间: 2011-1-7 16:55     标题: 回复 5楼 的帖子

哦 看错了  你这个是计算一个月有多少天,我是要取指定日期的时间 比如说20110201 我要取的就是20110131这个值
作者: hucuibai    时间: 2011-1-7 17:06

  1. @echo
  2. setlocal enabledelayedexpansion
  3. set /a day=%date:~5,2%%date:~8,2%
  4. set /a month=%date:~5,2%%%100
  5. echo %day%
  6. pause
复制代码


ECHO 处于打开状态。

C:\Documents and Settings\Administrator\桌面>setlocal enabledelayedexpansion

C:\Documents and Settings\Administrator\桌面>set /a day=0201

C:\Documents and Settings\Administrator\桌面>set /a month=02%100

C:\Documents and Settings\Administrator\桌面>echo 129
129

C:\Documents and Settings\Administrator\桌面>pause
请按任意键继续. . .

[ 本帖最后由 hucuibai 于 2011-1-7 17:08 编辑 ]
作者: hanyeguxing    时间: 2011-1-7 17:14

原帖由 hucuibai 于 2011-1-7 16:55 发表
哦 看错了  你这个是计算一个月有多少天,我是要取指定日期的时间 比如说20110201 我要取的就是20110131这个值

把月减1,获取上个月的天数,也就是上个月最后一天的日期。

要求%date%必须形如2011-01-07。
换个写法,要求年份为1900以后:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a Y=%date:~0,4%,M=1%date:~5,2%%%100-1,R=Y%%4
  3. if %M%==0 set/a M=12,Y-=1
  4. set/a M2=M*2-2
  5. set A=312831303130313130313031
  6. set E=!A:~%M2%,2!
  7. if %R%==0 if %M%==2 set E=29
  8. set M=0%M%
  9. echo 今天的日期:%date:~0,10%
  10. echo 上个月的最后一天是:%Y%-%M:~-2%-%E%
  11. pause
复制代码
什么是闰年?
①、普通年能被4整除而不能被100整除的为闰年。 (如2004年就是闰年,1900年不是闰年)
②、世纪年能被400整除而不能被3200整除的为闰年。 (如2000年是闰年,3200年不是闰年)
③、对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年。(如172800年是闰年,86400年不是闰年)
公元前闰年规则如下:
①、非整百年:年数除4余数为1是闰年,即公元前1、5、9……年;
②、整百年:年数除400余数为1是闰年,年数除3200余数为1,不是闰年,年数除172800余1又为闰年,即公元前401、801……年

[ 本帖最后由 hanyeguxing 于 2011-1-7 18:10 编辑 ]




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2