[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 批处理怎样进行日期计算?

输入任意日期,比如要输入日期20100610 ,输出显示第一次是输入日期, 第二次是+5的日期,第三次是+7的日期,第四次是+8的日期,第五次是+9的日期,第六次是+10的日期。日期格式2010-06-10

使用说明:
输入格式:基准日期 间隔日期1 间隔日期2...... b/B +/-
1,以上必须按顺序输入各个参数,使用空格 或英文逗号,或英文分号;分隔。
2,这里的基准日期,必须为8位数字,必须为纯数字构成
3,间隔时间,必须指定,必须为纯数字构成
4,+/-,必须指定,+为几天后,-为几天前
5,B为模式参数,可以不指定,忽略大小写:
当指定B时,表明间隔日期都是与基准日期的差,此时间隔时间必须为递增数列
当不指定B时,表明间隔日期都是与前一日期的差
示例1:20100610 1 5 7 10 B +
输出:
2010-06-10
2010-06-11
2010-06-15
2010-06-17
2010-06-20
示例2:20100610 1 5 7 10 +
输出:
2010-06-10
2010-06-11
2010-06-16
2010-06-23
2010-07-03
示例3:20100610 1 5 7 10 b -
输出:
2010-06-10
2010-06-09
2010-06-05
2010-06-03
2010-05-30
示例4:20100610 1 5 7 10 -
输出:
2010-06-10
2010-06-09
2010-06-04
2010-05-27
2010-05-17
示例5,关于简化操作:如果想只输入日期如20100610,而其他参数固定,则可以修改代码。
在代码中找到第5行,::set "#P=!#P! 3 7 14 28 43 B +" ,将这里修改成需要的参数,并将行首的 :: 去掉就可以。
输出:
2010-06-10
2010-06-13
2010-06-17
2010-06-24
2010-07-08
2010-07-23
  1. @echo off&set "err=(出错)"
  2. :Han
  3. setlocal enabledelayedexpansion
  4. set/p #P=请必须按照规范输入:
  5. ::set "#P=!#P! 3 7 14 28 43 B +"
  6. for %%a in (%#P%) do set/a N+=1&call set #P%%N%%=%%a
  7. if "!#P%N%!"=="+" (set K=+) else if "!#P%N%!"=="-" (set K=-) else set R=%N%&goto:err
  8. if %N% leq 2 set R=1&goto:err
  9. :A
  10. if not "!#P1:~%A%,1!"=="" set/a A+=1&goto:A
  11. if %A% neq 8 set R=1&goto:err
  12. set/a N-=1
  13. if /i "!#P%N%!"=="B" set B==&set/a N-=1
  14. for /l %%a in (1,1,%N%) do (set A=!#P%%a!
  15. for /l %%b in (0,1,9) do if defined A set "A=!A:%%b=!"
  16. if not "!A!"=="" set R=%%a&goto:err
  17. if %%a==2 set C=!#P%%a!
  18. if %%a geq 3 if defined B (set/a C2=!#P%%a!-C1&if !C2! leq 0 set R=%%a&goto:err) else set C2=!#P%%a!
  19. set "C=!C! !C2!"&set C1=!#P%%a!)
  20. set Y=%#P1:~0,4%&set M=%#P1:~4,2%&set D=%#P1:~-2%&set Han=!Y!-!M!-!D!
  21. if "%M:~0,1%"=="0" set M=%M:~1%
  22. if %M% lss 1 set R=1&goto:err
  23. if %M% gtr 12 set R=1&goto:err
  24. if "%D:~0,1%"=="0" set D=%D:~1%
  25. call:Xing
  26. if %D% lss 1 set R=1&goto:err
  27. if %D% gtr %E% set R=1&goto:err
  28. for %%a in (%C%) do call:Ye,%%a
  29. for %%a in (%Han%) do echo.%%a
  30. pause&exit
  31. :Ye
  32. set/a D%K%=%1
  33. :Gu
  34. call:Xing
  35. if "%K%"=="+" (
  36. if %D% gtr %E% set/a M+=1,D-=E
  37. if !M!==13 set/a Y+=1,M=1
  38. if %D% gtr %E% goto:Gu
  39. ) else (
  40. if %D% leq 0 set/a M-=1,D+=E
  41. if !M!==0 set/a Y-=1,M=12
  42. if %D% leq 0 goto:Gu)
  43. set M_=0%M%&set D_=0%D%&set "Han=!Han! %Y%-!M_:~-2!-!D_:~-2!"
  44. goto:eof
  45. :Xing
  46. set/a "M1=^!(M-2)","Y1=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)","M2=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","E=M1*(28+Y1)+M2*30+(^!M1&^!M2)*31"
  47. goto:eof
  48. :err
  49. set #P%R%=!#P%R%!%err%
  50. echo.输入出现错误:请按任意键重新开始
  51. set #P&pause>nul&Endlocal&cls&goto:Han
复制代码

[ 本帖最后由 hanyeguxing 于 2010-6-13 11:36 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

谢谢

首先非常感谢您在论坛给我的回答。我只是一个电脑爱好者,刚接触批处理,对于一些代码还是不懂。因为工作的关系,经常要算日期,预约,有时会算错,网上也没现成的工具可用,所以想到用个小工具。真的非常感谢您。
另外想提几个问题,希望您能解答:
1.输入日期是否能判断。比如日期输错了如28372 ,能否增加判断是无效字符,月份大于13的,日期大于31的。
2.、我想显示的是 ,第一次:输入日期, 第二次:输入日期+3,第三次:输入日期+7,第四次:输入日期+14,第五次:输入日期+28,第六次:输入日期+43。 (第一次,第二次。。也要显示出来)
希望能得到您的帮助!

TOP

回复 3楼 的帖子

已在2楼更新内容。。。。
错误信息返回示例:
#P=为键入的信息。
1,例如基准日期为7位:2010061 1 5 7 10 -
输入出现错误:请按任意键重新开始
#P=2010061 1 5 7 10 -
#P1=2010061(出错)
#P2=1
#P3=5
#P4=7
#P5=10
#P6=-
#P1=2010061(出错)表明第一个参数出错。第一个参数必须为8位纯数字。
2,例如基准日期为9位:201006100 1 5 7 10 -
输入出现错误:请按任意键重新开始
#P=201006100 1 5 7 10 -
#P1=201006100(出错)
#P2=1
#P3=5
#P4=7
#P5=10
#P6=-
#P1=201006100(出错)表明第一个参数出错。第一个参数必须为8位纯数字。
3,例如基准日期为8位含非数字字符:2010061A 1 5 7 10 -
输入出现错误:请按任意键重新开始
#P=2010061A 1 5 7 10 -
#P1=2010061A(出错)
#P2=1
#P3=5
#P4=7
#P5=10
#P6=-
#P1=2010061A(出错)表明第一个参数出错。第一个参数必须为8位纯数字。
4,例如参数+/-错误:20100610 1 5 7 10 A
输入出现错误:请按任意键重新开始
#P=20100610 1 5 7 10 A
#P1=20100610
#P2=1
#P3=5
#P4=7
#P5=10
#P6=A(出错)
#P6=A(出错)表明最后一个参数出错。最后一个参数必须为+或-。
5,例如参数B错误:20100610 1 5 7 A +
输入出现错误:请按任意键重新开始
#P=20100610 1 5 7 A +
#P1=20100610
#P2=1
#P3=5
#P4=7
#P5=A(出错)
#P6=+
#P5=A(出错)表明倒数第二个参数出错。如果用来指定模式,则只能为字符B或b;如果是间隔时间,则必须为纯数字。
6,例如参数间隔时间错误:20100610 1 5 7 C b -
输入出现错误:请按任意键重新开始
#P=20100610 1 5 7 C b -
#P1=20100610
#P2=1
#P3=5
#P4=7
#P5=C(出错)
#P6=b
#P7=-
#P5=C(出错)表明参数间隔时间出错。间隔时间,则必须为纯数字。
7,例如参数间隔时间逻辑错误:20100610 1 9 7 21 b -
输入出现错误:请按任意键重新开始
#P=20100610 1 9 7 21 b -
#P1=20100610
#P2=1
#P3=9
#P4=7(出错)
#P5=21
#P6=b
#P7=-
#P4=7(出错)表明参数间隔时间出现逻辑错误。B模式下间隔时间必须依次递增。
8,使用以下基准日期也会报错:
20100631,因为6月没有31日
20100001,因为不存在0月
20100229,因为2010年2月没有29日

[ 本帖最后由 hanyeguxing 于 2010-6-13 11:22 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表