[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
稍作修改, 少许提高效率:
  1. @echo off & setlocal enabledelayedexpansion
  2. set /p ymds=请输入起始日期(yyyymmdd):
  3. set /p ymde=请输入截止日期(yyyymmdd):
  4. (set y=!ymds:~0,4!)&(set m=!ymds:~4,2!)&(set d=!ymds:~6,2!)
  5. set /a "y=1!y!-10000, m=1!m!-100, d=1!d!-100"
  6. echo 起始日期为:!y!-!m!-!d!
  7. set /a "leap=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
  8. set /a "f=^!(m-2), s=^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11)"
  9. set /a "dmax=f*(28+leap)+s*30+(^!f&^!s)*31"
  10. (set _y=000!y!)&(set _y=!_y:~-4!)&(set _m=0!m!)&(set _m=!_m:~-2!)
  11. :loop
  12. (set _d=0!d!)&(set _d=!_d:~-2!)
  13. if "!_y!!_m!!_d!" leq "!ymde!" (echo !_y!!_m!!_d!) else goto :break
  14. set /a d+=1
  15. if !d! gtr !dmax! (
  16. (set d=1)&(set /a m+=1)
  17. if !m! gtr 12 (
  18. (set m=1)&(set /a y+=1)&(set _y=000!y!)&(set _y=!_y:~-4!)
  19. set /a "leap=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
  20. )
  21. set /a "f=^!(m-2), s=^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11)"
  22. set /a "dmax=f*(28+leap)+s*30+(^!f&^!s)*31"
  23. (set _m=0!m!)&(set _m=!_m:~-2!)
  24. )
  25. goto :loop
  26. :break
  27. pause
复制代码

TOP

4 楼还有起始月输出不正确的问题:
  1. e=!m:~%n%,2!
复制代码
如此截取是有问题的

TOP

借鉴了 4 楼日数序列的方法, 效率仍不高, 看来可看下 FOR 的思路并尝试
  1. @echo off&setlocal enabledelayedexpansion
  2. (set days=312831303130313130313031)
  3. set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
  4. set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
  5. if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
  6. if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
  7. if "!ymde!" lss "!ymds!" (
  8.   (set tt=!ymde!)&(set ymde=!ymds!)&(set ymds=!tt!)
  9. )
  10. (set y=!ymds:~0,4!)&(set m=!ymds:~4,2!)&(set d=!ymds:~6,2!)
  11. set /a "y=1!y!-10000, m=1!m!-100, d=1!d!-100"
  12. echo 起始日期为:!y!-!m!-!d!, 截止日期为:!ymde!
  13. (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
  14. if !m!==2 set /a "dmax+=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
  15. (set _y=000!y!)&(set _y=!_y:~-4!)&(set _m=0!m!)&(set _m=!_m:~-2!)
  16. :loop
  17. (set _d=0!d!)&(set _d=!_d:~-2!)
  18. if "!_y!!_m!!_d!" leq "!ymde!" (echo !_y!!_m!!_d!) else goto :break
  19. set /a d+=1
  20. if !d! gtr !dmax! (
  21.   (set d=1)&(set /a m+=1)
  22.   if !m! gtr 12 (set m=1)&(set /a y+=1)&(set _y=000!y!)&(set _y=!_y:~-4!)
  23.   (set _m=0!m!)&(set _m=!_m:~-2!)  
  24. (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
  25. if !m!==2 set /a "dmax+=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
  26. )
  27. goto :loop
  28. :break
  29. pause
复制代码

TOP

实质是变量延迟的问题, 调试代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p a=起始日期,格式20071221:
  3. set/p b=终止日期,格式20080310:
  4. set m=寒夜312831303130313130313031孤星
  5. if "%a:~4,1%"=="0" (set tm=%a:~5,1%) else set tm=%a:~4,2%
  6. if "%a:~6,1%"=="0" (set td=%a:~7,1%) else set td=%a:~6,2%
  7. set ty=%a:~0,4%&echo.%a%
  8. :hanye
  9. echo n=!n!
  10. set/a n=%tm%*2,y=%ty%%%4,td=%td%+1,e=!m:~%n%,2!
  11. echo n=!n!,e=!e!
  12. pause
  13. if %tm%==2 if %y%==0 set e=29
  14. if %td% gtr %e% set/a tm=%tm%+1,td=1
  15. if %tm%==13 set/a ty=%ty%+1,tm=1
  16. if %tm% lss 10 (set em=0%tm%) else set em=%tm%
  17. if %td% lss 10 (set ed=0%td%) else set ed=%td%
  18. set d=%ty%%em%%ed%
  19. if %d% gtr %b% pause>nul&goto :eof
  20. echo.%d%&goto :hanye
复制代码
测试结果:
起始日期,格式20071221:18991125
终止日期,格式20080310:20000305
18991125
n=
n=22,e=0

我的代码中用的是如下方式来截取的:
  1. (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
复制代码

TOP

以下代码同样用 100 年的日期测试, 用时与 7 楼 FOR 的代码极为接近
对输入的日期前后无限制, 可自动将在前的日期作为起始日期
其中 如: if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) 这样的判断语句还可省去, 进一步提高效率, 但未有简洁方案, 太显繁长
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
  3. set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
  4. (set t=%time%)&(cd.>outFile.txt)
  5. for /l %%m in (1,1,12) do (set days_%%m=31)
  6. for %%m in (4,6,9,11) do (set days_%%m=30)
  7. if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
  8. if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
  9. if "!ymde!" lss "!ymds!" (set tt=!ymde!)&(set ymde=!ymds!)&(set ymds=!tt!)
  10. echo 起始日期为:!ymds!, 截止日期为:!ymde!
  11. (set /a ys=1!ymds:~0,4!-10000, ye=1!ymde:~0,4!-10000)
  12. (set /a ms=1!ymds:~4,2!-100, me=1!ymde:~4,2!-100)
  13. (set /a ds=1!ymds:~6,2!-100, de=1!ymde:~6,2!-100)
  14. set /a "y_1=ys+1,m_1=ms+1,d_1=ds+1"
  15. for /l %%y in (!ys!,1,!ys!) do (
  16.   (set _y=000%%y)&(set _y=!_y:~-4!)
  17.   for /l %%m in (!ms!,1,!ms!) do (
  18.     (set _m=0%%m)&(set _m=!_m:~-2!)
  19.     if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
  20.     for /l %%d in (!ds!,1,9) do (
  21.       if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
  22.     )
  23.     if !ds! geq 10 (set d_2=!ds!) else set d_2=10
  24.     for /l %%d in (!d_2!,1,!days_%%m!) do (
  25.       if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
  26.     )
  27.   )
  28.   for /l %%m in (!m_1!,1,12) do (
  29.     (set _m=0%%m)&(set _m=!_m:~-2!)
  30.     if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
  31.     for /l %%d in (1,1,9) do (
  32.       if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
  33.     )
  34.     for /l %%d in (10,1,!days_%%m!) do (
  35.       if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
  36.     )
  37.   )
  38. )>>outFile.txt
  39. for /l %%y in (!y_1!,1,!ye!) do (
  40.   (set _y=000%%y)&(set _y=!_y:~-4!)
  41.   for /l %%m in (1,1,12) do (
  42.     (set _m=0%%m)&(set _m=!_m:~-2!)
  43.     if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
  44.     for /l %%d in (1,1,9) do (
  45.       if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
  46.     )  
  47.     for /l %%d in (10,1,!days_%%m!) do (
  48.       if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
  49.     )
  50.   )
  51. )>>outFile.txt
  52. :break
  53. echo 用时: !t! ==^> %time%
  54. start outFile.txt
  55. pause
  56. exit /b
复制代码

[ 本帖最后由 neorobin 于 2010-4-8 03:46 编辑 ]

TOP

借鉴各位的技巧和思路,特别是 FOR 的, 再发一个:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
  3. set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
  4. if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
  5. if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
  6. if "!ymde!" lss "!ymds!" (set tt=!ymde!&set ymde=!ymds!&set ymds=!tt!)
  7. echo 起始日期为:!ymds!, 截止日期为:!ymde!
  8. set /p=%time% ==^><nul
  9. for /l %%i in (0 1 31) do set _%%i=0%%i&set "_%%i=!_%%i:~-2!"
  10. (for /l %%m in (1,1,12) do set SD_%%m=31)&for %%m in (4,6,9,11) do set SD_%%m=30
  11. set /a ys=1!ymds:~0,4!-10000, ye=1!ymde:~0,4!-10000
  12. set /a ms=1!ymds:~4,2!-100, me=1!ymde:~4,2!-100
  13. set /a ds_diff=1!ymds:~6,2!-101, dEnd=1!ymde:~6,2!-100
  14. (for /l %%y in (%ymds:~0,4% 1 %ymde:~0,4%) do (
  15.   set /a "SD_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
  16.   if %%y gtr !ys! (set ms=1)
  17.   if %%y lss !ye! (
  18.     for /l %%m in (!ms!,1,12) do (
  19.       set /a "ds=1+(^!(%%y^^ys)&^!(%%m^^ms))*ds_diff"
  20.       for /l %%d in (!ds!,1,!SD_%%m!) do echo %%y!_%%m!!_%%d!
  21.     )
  22.   ) else for /l %%m in (!ms!,1,!me!) do (
  23.       set /a "ds=1+(^!(%%y^^ys)&^!(%%m^^ms))*ds_diff"
  24.       if %%m geq !me! (set de=!dEnd!) else (set de=!SD_%%m!)
  25.       for /l %%d in (!ds!,1,!de!) do echo %%y!_%%m!!_%%d!
  26.   )
  27. ))>out.txt
  28. echo %time%&start out.txt&pause
复制代码

TOP

返回列表