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

[日期时间] 批处理怎样输出两个指定日期之间的所有日期?

本帖最后由 DAIC 于 2011-6-11 22:13 编辑

开始日期:1810-01-01
结束日期:2010-01-01
希望得到的结果(总共73050行):
1810-01-01
1810-01-02
1810-01-03
...
2010-01-01

15楼的结果:
c:\Test>timeit test.bat
Elapsed Time:     0:00:34.590
Process Time:     0:00:23.212

28楼的结果:
c:\Test>timeit test.bat
Elapsed Time:     0:00:19.345
Process Time:     0:00:11.778

参考:http://bbs.bathome.net/thread-12558-1-1.html
可以把日期看成一个大数18990101~19990101之间的数去较对正误就行了!
一个FOR+一个CALL把他们的程序拿来就行了呵
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

直接输出还是不要用call,call太影响效率了。。。
***共同提高***

TOP

本帖最后由 mxxcgzxxx 于 2011-6-4 11:28 编辑
  1. @echo off
  2. set 正模式=
  3. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]0[1-9]$"
  4. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]1[0-9]$"
  5. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[^02]2[0-9]$"
  6. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]022[0-8]$"
  7. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[13578]3[0-1]$"
  8. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[469]30$"
  9. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]1[0-2]0[1-9]$"
  10. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]1[0-2][12][0-9]$"
  11. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]1[02]3[0-1]$"
  12. set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]1130$"
  13. set "正模式=%正模式% ^[1-2][0-9][13579][26]0229$"
  14. set "正模式=%正模式% ^[1-2][0-9][2468][048]0229$"
  15. set "正模式=%正模式% ^[1-2][0-9][02468][48]0229$"
  16. set "正模式=%正模式% ^[02468][048]000229$"
  17. set "正模式=%正模式% ^[13579][26]000229$"
  18. :loop
  19. set /p 开始日期=按yyyymmdd格式输入开始日期:
  20. echo.%开始日期%|findstr "%正模式%">nul && set "a=%开始日期%" || goto :loop
  21. :loop1
  22. set /p 结束日期=按yyyymmdd格式输入结束日期:
  23. echo.%开始日期%|findstr "%正模式%">nul && cls || goto :loop1
  24. if %结束日期% lss %开始日期% echo 结束日期小于开始日期! & goto:loop1
  25. :1
  26. if %a:~4,2%==13 set /a a=a/10000*10000+9999
  27. if %a:~6,2%==32 set /a a=a/100*100+99
  28. echo.%a%|findstr "%正模式%">nul && echo %a%
  29. if %a%==%结束日期% goto :2
  30. set /a a+=1        
  31. goto :1
  32. :2
  33. pause>nul
  34. goto :loop
复制代码
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

@echo off & setlocal enabledelayedexpansion

set 正模式=
set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]0[1-9]$"
set "正模式=%正模式% ^[1-2][0-9][0-9][0-9]0[1-9]1[0-9]$"
set "正模式=%正模式% ^[1 ...
mxxcgzxxx 发表于 2011-6-4 11:21



提示一下,可以这样输出:
  1. (@for /l %%a in (start 1 end) do @echo %%a)|findstr "正则"
复制代码
如果日期很多的话,这应该是效率最高的办法了
另一种思路是也许可以用for /l嵌套,采用年循环、月循环、日循环的方式一次性输出正确日期,日期比较少时应该野不慢

TOP

本帖最后由 mxxcgzxxx 于 2011-6-4 11:33 编辑

我没采用FOR是因为13~99月那里很浪费时间,现在改了下取消了变量延时开关会更快点吧
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

4# mxxcgzxxx


这个代码运行了六七分钟,才刚刚跑到1926年,怎样才能提高速度呢?

TOP

看看这个帖子:
按日期早晚顺序列出指定范围内的所有日期
http://bbs.bathome.net/viewthread.php?tid=7526
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

本帖最后由 zm900612 于 2011-6-6 13:03 编辑

这个非常快
  1. @echo off
  2. (cmd /q /v:on /c "for /l %%a in (1990 1 2012) do (for /l %%b in (1 1 12) do (for /l %%c in (1 1 31) do ((set "m=10%%b"&set "d=10%%c")&echo %%a!m:~-2!!d:~-2!)))")|findstr /ve "0[2469]31 0230 1131 [02468][048]0229 [13579][26]0229 [02468][048]000229 [13579][26]000229"
  3. pause
复制代码
为了省些代码只好弄成这个样子了...易读性不是很强,但是思路其实很简单,就是先输出所有有可能合法的日期,再用findstr排除不合法日期...

TOP

8# namejm


http://bbs.bathome.net/viewthrea ... muid=38107#pid49141
这个代码看不懂,能否教一下怎么设置开始日期和结束日期?

TOP

9# zm900612


有问题:
19000228
19000230
19000301

TOP

漏了排除2月30,已修正

TOP

本帖最后由 batman 于 2011-6-6 13:21 编辑

9# zm900612
写个setlocal enabledelayedexpansion就这么难?非要用cmd /vn,效率我想前者还是要快一点点点吧。。。

20000229非法,哈哈。。。
***共同提高***

TOP

13# batman


通道之前存在语块时,语块中的内容相当于直接输入到cmd窗口中运行,此时变量延迟是没有效果的,若要用!str!这样的变量,唯有使用cmd /vn来作为语块执行的媒介,而cmd /c是以参数的形式接收要执行的内容,所以无法换行...

整百年份有判断,不过逻辑错误,好像判断反了

TOP

本帖最后由 batman 于 2011-6-6 16:08 编辑

老实人做老实事:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo,&set /p start=请输入开始日期(形如2000-03-21):
  3. echo,&set /p end=请输入结束日期(形如2000-03-21):
  4. cls&echo,&echo,&echo,&echo,&echo         程序正在运行中,请稍候。。。
  5. set /a sy=%start:~,4%,sm=1%start:~5,2%%%100,sd=1%start:~8,2%%%100,ey=%end:~,4%,em=1%end:~5,2%%%100,ed=1%end:~8,2%%%100,a=31
  6. for %%a in (1 3 5 7 8 10 12 4 6 9 11) do (
  7.   if %%a equ 4 set /a a-=1
  8.   set /a _%%a=a
  9. )
  10. (for /l %%a in (%sy%,1,%ey%) do (
  11.   set /a "_2=^!(%%a%%4)&^!(^!(%%a%%100))|^!(%%a%%400)+28"
  12.   set /a a=1,b=12
  13.   if "%%a" equ "%sy%" set /a a=sm
  14.   if "%%a" equ "%ey%" set /a b=em
  15.   for /l %%b in (!a!,1,!b!) do (
  16.     set /a c=1,d=_%%b
  17.     if "%%a%%b" equ "%sy%%sm%" set /a c=sd
  18.     if "%%a%%b" equ "%ey%%em%" set /a d=ed
  19.     for /l %%c in (!c!,1,!d!) do (
  20.       for %%d in (%%b %%c) do set ".%%d=0%%d"&set ".%%d=!.%%d:~-2!"
  21.       echo %%a-!.%%b!-!.%%c!
  22.     )
  23.   )
  24. ))>list.txt
  25. start list.txt      
复制代码
***共同提高***

TOP

返回列表