Board logo

标题: [日期时间] [已解决]批处理如何输出指定范围内的完整日期? [打印本页]

作者: jellyhk    时间: 2011-11-11 17:30     标题: [已解决]批处理如何输出指定范围内的完整日期?

本帖最后由 jellyhk 于 2011-11-12 21:35 编辑

郁闷!语文差了不知道该怎么写正确合理的标题!

标准格式为:20110101[这是年月日]
有2个变量一个sta[为输入开始年月日]
             一个end[为输入结束年月日]

要求:显示中间包含的所有正确年月日。(当然能力不够可以把每个月都当31天显示也行)
例如:set sta=20110101            set end=20120202
[写出来的代码最好能这样----我输入end=99991231也能正确显示-------------如果没时间做这段就算了]

显示格式:
20110101
20110102
20110103
......
20111231
::这里就是下一年的过度了
20120101
...
20120202
作者: CrLf    时间: 2011-11-11 20:27

本帖最后由 CrLf 于 2011-11-12 22:07 编辑

正好以前写过类似的
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p start=StartDate(YYYYMMDD):
  3. set /p end=EndDate  (YYYYMMDD):
  4. for /l %%a in (101 1 131) do (
  5. set str=%%a
  6. set b=!b! !str:~-2!
  7. if %%a leq 112 set a=!b!
  8. )
  9. (for /l %%a in (%start:~,-4% 1 %end:~,-4%) do (
  10. for %%b in (%a%) do (
  11. for %%c in (%b%) do (
  12. set /a "test=(%%a%%b%%c-start|end-%%a%%b%%c)>>31"
  13. if !test!==0 echo %%a%%b%%c
  14. )
  15. )
  16. ))>tmp 2>nul
  17. findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229" tmp|findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229">结果.txt
  18. pause
复制代码
原算法有数值溢出问题,已修改
作者: 601997526    时间: 2011-11-11 20:41

这个有点意思,我也来写一个
作者: 601997526    时间: 2011-11-11 21:25

  1. @echo off&setlocal enabledelayedexpansion
  2. set date=%date%
  3. :sta
  4. cls
  5. set /p sta=[输入开始年月日]
  6. echo %sta%|findstr "^[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]$" >nul||goto :sta
  7. :end
  8. cls
  9. set /p end=[输入结束年月日]
  10. echo %end%|findstr "^[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9]$" >nul||goto :end
  11. echo 正在计算日期……
  12. set 年1=%sta:~0,4%&set 年2=%end:~0,4%
  13. set 月1=%sta:~4,2%&set 月2=%end:~4,2%&set 月end=12
  14. set 日1=%sta:~6,2%&set 日2=%end:~6,2%&set 日end=31
  15. for /l %%a in (1%年1% 1 1%年2%) do (set 年=%%a
  16. if "%%a"=="1%年2%" set 月end=%月2%
  17. for /l %%b in (1!月1! 1 1!月end!) do (set 月=%%b
  18. if "%%a"=="1%年2%" (if "1!月end!"=="%%b" set 日end=%日2%)
  19. for /l %%c in (1!日1! 1 1!日end!) do (set 日=%%c
  20. date !年:~-4!-!月:~-2!-!日:~-2! <nul>nul&&echo !年:~-4!!月:~-2!!日:~-2! >>b.txt
  21. )
  22. set 日1=01
  23. )
  24. set 月1=01
  25. )
  26. date %date%
复制代码

作者: awk    时间: 2011-11-12 00:59

http://bbs.bathome.net/thread-12669-1-1.html
作者: jellyhk    时间: 2011-11-12 21:34

高手就是高手!轻轻一想就搞定了!成功!慢慢回家看!眼睛花了!
作者: jellyhk    时间: 2011-11-13 11:44

回复 2# CrLf
下面都忽略符号  “-”为了数字好看不眼睛花

有个bug啊!我输入2011-01-01-01---------2011-02-02-02
也能算....2011-01-01-02
------------------斑竹改的时候帮忙正确输出日期的后面加几个数字---
例如:正确输出日期后加了数字01-20是
2011-01-0101
2011-01-0202
...
2011-01-2020   <只加到20再从1-20
2011-01-2101   <这里是01不能是1
....
2011-02-1020    <这里又是20
2011-02-1101    <又是01     
一直01-20重复
作者: CrLf    时间: 2011-11-13 11:59

回复 7# jellyhk


    你举的例子不是没有 - 的吗?怎么测试时又加个 -?
作者: jellyhk    时间: 2011-11-13 12:16

测试没加  -
这里是方便看,数字多了眼花  忽略它
作者: CrLf    时间: 2011-11-13 12:18

本帖最后由 CrLf 于 2011-11-13 12:21 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p @start=StartDate(YYYYMMDD):
  3. set /p @end=EndDate  (YYYYMMDD):
  4. set @|findstr /vx "@[a-t]*=[0-9]*[0-9][0-9][0-9][0-9]"&&(
  5.         echo 错误的日期格式
  6.         pause&endlocal&%0
  7. )
  8. for /l %%a in (101 1 131) do (
  9.         set str=%%a
  10.         set b=!b! !str:~-2!
  11.         if %%a leq 112 set a=!b!
  12.         if %%a leq 120 set c=!b!
  13. )
  14. (for /l %%a in (%@start:~,-4% 1 %@end:~,-4%) do (
  15.         for %%b in (%a%) do (
  16.                 for %%c in (%b%) do (
  17.                         set /a "test=(%%a%%b%%c-%@start:-=%|%@end:-=%-%%a%%b%%c)>>31"
  18.                         if !test!==0 echo %%a%%b%%c
  19.                 )
  20.         )
  21. ))>tmp1 2>nul
  22. findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229" tmp1|findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229">tmp2
  23. (for /f %%a in ('find /c /v ""^<tmp2') do (
  24. for /l %%b in (1 20 %%a) do (
  25. setlocal
  26. for %%c in (%c%) do (
  27. set /p var=
  28. echo;!var!%%c
  29. )
  30. endlocal
  31. )
  32. ))<tmp2 >结果.txt
  33. del tmp?>nul
  34. pause
复制代码

作者: jellyhk    时间: 2011-11-13 12:47

谢了。成功!解决了我一大烦恼!顺便问问这3句代码每句个是什么意思!
if not defined str goto end
set "str=%str:"=%"
if defined str call :count
作者: jellyhk    时间: 2011-11-13 12:53

斑竹!我反了个大错!郁闷!一看结果发现我上面要求说错了!该是
每一个相同的年月日后加01-20
2011-01-01-01
2011-01-01-02
...
2011-01-01-20
...
2011-01-02-01
2011-01-02-02
....
2011-01-02-20
作者: jellyhk    时间: 2011-11-13 12:54

你这代码怕我要隔几年才看的懂!自己改不了!真是对不起!
作者: CrLf    时间: 2011-11-13 14:08

把这部分
  1. (for /f %%a in ('find /c /v ""^<tmp2') do (
  2.         for /l %%b in (1 20 %%a) do (
  3.                 setlocal
  4.                 for %%c in (%c%) do (
  5.                         set /p var=
  6.                         echo;!var!%%c
  7.                 )
  8.                 endlocal
  9.         )
  10. ))<tmp2 >结果.txt
复制代码
替换成:
  1. (for /f %%a in (tmp2) do (
  2.         for %%b in (%c%) do echo %%a%%b
  3. ))>结果.txt
复制代码





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