标题: [数值计算] 根据给定的两个起止日期按先后/早晚顺序列出指定范围内的所有日期 [打印本页]
作者: namejm 时间: 2010-4-7 19:40 标题: 根据给定的两个起止日期按先后/早晚顺序列出指定范围内的所有日期
本帖最后由 pcl_test 于 2017-4-6 08:42 编辑
在其他论坛看到有这样一个需求:
建立以日期为名字的文件夹,从20100406到20101230
感觉这个需求有很多地方都可能用得到,因此,我想把这个问题扩展一下,使得它更具有通用性,具体要求为:
1、能在批处理界面中通过手工输入起止日期的方式,自动生成起止日期范围内的所有日期数列(必须考虑平年闰年大月小月),按日期早晚输出到文本中去,一行一条数据,日期格式为8位的纯数字格式,比如20100407;
2、如果在批处理界面中只输入一个日期,将以系统当前日期为起点,以输入的日期为终点,按照上一条的格式输出数据;
3、最好不生成临时数据。
=====================================
再加一条:
4、最好通过纯批处理来处理,速度不能太慢。
对第2点做稍许变动:如果只输入一个日期,则和系统当前日期做比较,以较早的日期为起点,较晚的日期为终点,按照第1条的要求输出数据。
其中,难点在于第1和第3点,把这两点解决了,第2点将迎刃而解。
难点提示:
1、年份有平年闰年之分,日期大小月各不相同;
2、系统的日期格式有很多种,在处理时需要做格式化,统一成形如YYYYMMDD的8位纯数字;
3、若照搬以前那个批处理版万年历的代码,将难以按照日期早晚的顺序输出数据。
关于闰年的判断方法(转自百度百科:http://baike.baidu.com/view/29649.htm?fr=ala0_1):
判定公历闰年遵循的一般规律为: 四年一闰,百年不闰,四百年再闰.
公历闰年的精确计算方法:(按一回归年365天5小时48分45.5秒)
①、普通年能被4整除的为闰年。(如2004年就是闰年,1901年不是闰年)
②、世纪年能被100整除而不能被400整除的不是闰年。(如2000年是闰年,3200年是闰年,1900年不是闰年)
③、对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年.(如172800年是闰年,864000年不是闰年)
作者: GNU 时间: 2010-4-7 21:39
BAT调用VBS或者第三方命令行工具均可实现,不过似乎和第三点有些冲突。
还可以调用现成的日期计算函数,但效率估计不是很高。
作者: namejm 时间: 2010-4-7 21:49
最好通过纯批处理来实现。
作者: hanyeguxing 时间: 2010-4-7 21:53
- @echo off&setlocal enabledelayedexpansion
- :han
- set a=
- set b=
- set/p a=起始日期,格式20071221:
- set/p b=终止日期,格式20080310,允许为空:
- if "%a%"=="" echo.此数值不允许为空,请按任意键重新开始&pause>nul&goto :han
- set m=寒夜312831303130313130313031孤星
- for /f "tokens=1,2,3 delims=-:/ " %%i in ("%date%") do set i=%%i%%j%%k
- if "%b%"=="" (if %i% gtr %a% (set b=%i%) else set a=%i%&set b=%a%)
- if "%a:~4,1%"=="0" (set tm=%a:~5,1%) else set tm=%a:~4,2%
- if "%a:~6,1%"=="0" (set td=%a:~7,1%) else set td=%a:~6,2%
- set ty=%a:~0,4%&echo.%a%
- :ye
- set/a "n=tm*2","td=td+1","y=(^!(ty%%4)&^!^!(ty%%100))|^!(ty%%400)"
- set e=!m:~%n%,2!
- if %tm%==2 if %y%==1 set e=29
- if %td% gtr %e% set/a "tm=tm+1",td=1
- if %tm%==13 set/a "ty=ty+1",tm=1
- set em=0%tm%&set ed=0%td%&set em=!em:~-2!&set ed=!ed:~-2!&set d=%ty%!em!!ed!
- if %d% gtr %b% echo 完成&pause>nul&goto :eof
- echo.%d%&goto :ye
复制代码
改了好几次,问题太多。。。还请大家多多指教
[ 本帖最后由 hanyeguxing 于 2010-4-8 01:05 编辑 ]
作者: neorobin 时间: 2010-4-7 22:10
稍作修改, 少许提高效率:- @echo off & setlocal enabledelayedexpansion
- set /p ymds=请输入起始日期(yyyymmdd):
- set /p ymde=请输入截止日期(yyyymmdd):
- (set y=!ymds:~0,4!)&(set m=!ymds:~4,2!)&(set d=!ymds:~6,2!)
- set /a "y=1!y!-10000, m=1!m!-100, d=1!d!-100"
- echo 起始日期为:!y!-!m!-!d!
- set /a "leap=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
- set /a "f=^!(m-2), s=^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11)"
- set /a "dmax=f*(28+leap)+s*30+(^!f&^!s)*31"
- (set _y=000!y!)&(set _y=!_y:~-4!)&(set _m=0!m!)&(set _m=!_m:~-2!)
- :loop
- (set _d=0!d!)&(set _d=!_d:~-2!)
- if "!_y!!_m!!_d!" leq "!ymde!" (echo !_y!!_m!!_d!) else goto :break
- set /a d+=1
- if !d! gtr !dmax! (
- (set d=1)&(set /a m+=1)
- if !m! gtr 12 (
- (set m=1)&(set /a y+=1)&(set _y=000!y!)&(set _y=!_y:~-4!)
- set /a "leap=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
- )
- set /a "f=^!(m-2), s=^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11)"
- set /a "dmax=f*(28+leap)+s*30+(^!f&^!s)*31"
- (set _m=0!m!)&(set _m=!_m:~-2!)
- )
- goto :loop
- :break
- pause
复制代码
作者: FOR 时间: 2010-4-7 22:14
计算 100 年的日期 耗时 3.7 秒- @echo off&setlocal enabledelayedexpansion
- set t=%time%
- echo 请输入8位数的起始日期和结束日期用空格分开
- echo 或只输入结束(开始)日期,默认当前日期为起始(结束)日期
- echo 输入格式 20080205 21080529&echo.
- set xx=19100201
- for /f "tokens=1,2" %%i in ("%xx%") do (
- if not "%%j"=="" (set qs=%%i&set js=%%j) else (
- for /f "tokens=1-3 delims=.\-/ " %%a in ("!date!") do (
- if %%a%%b%%c gtr %%i (set/a qs=xx,js=%%a%%b%%c) else (
- set/a qs=%%a%%b%%c,js=%%i
- ))))
- for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do set/a n+=1&set/a yue!n!=%%a
- set /a qsd=100%qs:~4,2%%%100,qsm=100%qs:~6,2%%%100
- set /a yuq=qsd,yuh=12,mq=qsm,mh=yue!qsd!
- (
- echo 起始日期 %qs:~0,4%-%qs:~4,2%-%qs:~6,2%
- echo 结束日期 %js:~0,4%-%js:~4,2%-%js:~6,2%
- for /l %%i in (%qs:~0,4% 1 %js:~0,4%) do (
- if %%i equ %js:~0,4% set /a yuh=100%js:~4,2%%%100&set flag=a
- for /l %%j in (!yuq! 1 !yuh!) do (
- if %%j equ 2 (
- set /a yue2="^!(%%i%%4)&^!(^!(%%i%%100))|^!(%%i%%400)"+28,mh=yue2
- ) else set /a mh=yue%%j
- if defined flag if %%j equ !yuh! set /a mh=100!js:~-2!%%100
- for /l %%k in (!mq! 1 !mh!) do (
- set numd=0%%j&set "numm=0%%k"
- echo %%i!numd:~-2!!numm:~-2!
- )
- set /a mq=1&echo;
- )
- set yuq=1
- )
- echo 耗时:
- echo %t%
- echo !time!
- )>c.txt
- start c.txt
- exit
复制代码
[ 本帖最后由 FOR 于 2010-4-7 23:22 编辑 ]
作者: namejm 时间: 2010-4-7 22:43
对第2点做稍许变动:如果只输入一个日期,则和系统当前日期做比较,以较早的日期为起点,较晚的日期为终点,按照第1条的要求输出数据。
作者: namejm 时间: 2010-4-7 22:58
hanyeguxing在4楼的代码没有做准确的平年闰年检测;FOR在7楼的代码输出的格式为 2010-4-1 ,由于未做充分测试,其他问题尚未发现。
作者: FOR 时间: 2010-4-7 23:03
输出格式已改,但对系统日期作统一处理不会。
作者: namejm 时间: 2010-4-7 23:10
Re FOR:
运行了你修改后的代码,发现生成350多K的数据竟然只花费了0秒——嘿嘿,貌似 echo %time% 要改成 call echo %%time%% 才对。
作者: FOR 时间: 2010-4-7 23:18
改成了 echo !time! 发现把输出格式改了后,多运行了一句set numd=0%%j&set "numm=0%%k" 速度居然到了3秒多
作者: hanyeguxing 时间: 2010-4-7 23:23
原帖由 namejm 于 2010-4-7 22:58 发表
hanyeguxing在4楼的代码没有做准确的平年闰年检测;FOR在7楼的代码输出的格式为 2010-4-1 ,由于未做充分测试,其他问题尚未发现。
判定公历闰年遵循的一般规律为: 四年一闰,百年不闰,四百年再闰.
崩溃。。。。。。。光记得4年的事了,其他的不是忘记了,而是根本就不知道,汗一个。。。
[ 本帖最后由 hanyeguxing 于 2010-4-7 23:27 编辑 ]
作者: neorobin 时间: 2010-4-7 23:43
4 楼还有起始月输出不正确的问题:复制代码
如此截取是有问题的
作者: neorobin 时间: 2010-4-7 23:47
借鉴了 4 楼日数序列的方法, 效率仍不高, 看来可看下 FOR 的思路并尝试- @echo off&setlocal enabledelayedexpansion
- (set days=312831303130313130313031)
- set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
- set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
- if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
- if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
- if "!ymde!" lss "!ymds!" (
- (set tt=!ymde!)&(set ymde=!ymds!)&(set ymds=!tt!)
- )
- (set y=!ymds:~0,4!)&(set m=!ymds:~4,2!)&(set d=!ymds:~6,2!)
- set /a "y=1!y!-10000, m=1!m!-100, d=1!d!-100"
- echo 起始日期为:!y!-!m!-!d!, 截止日期为:!ymde!
- (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
- if !m!==2 set /a "dmax+=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
- (set _y=000!y!)&(set _y=!_y:~-4!)&(set _m=0!m!)&(set _m=!_m:~-2!)
- :loop
- (set _d=0!d!)&(set _d=!_d:~-2!)
- if "!_y!!_m!!_d!" leq "!ymde!" (echo !_y!!_m!!_d!) else goto :break
- set /a d+=1
- if !d! gtr !dmax! (
- (set d=1)&(set /a m+=1)
- if !m! gtr 12 (set m=1)&(set /a y+=1)&(set _y=000!y!)&(set _y=!_y:~-4!)
- (set _m=0!m!)&(set _m=!_m:~-2!)
- (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
- if !m!==2 set /a "dmax+=(^!(y%%4)&^!^!(y%%100))|^!(y%%400)"
- )
- goto :loop
- :break
- pause
复制代码
作者: hanyeguxing 时间: 2010-4-7 23:52
原帖由 neorobin 于 2010-4-7 23:43 发表
4 楼还有起始月输出不正确的问题:e=!m:~%n%,2!如此截取是有问题的
没明白。。。能不能具体说一下?
作者: neorobin 时间: 2010-4-8 00:17
实质是变量延迟的问题, 调试代码:- @echo off&setlocal enabledelayedexpansion
- set/p a=起始日期,格式20071221:
- set/p b=终止日期,格式20080310:
- set m=寒夜312831303130313130313031孤星
- if "%a:~4,1%"=="0" (set tm=%a:~5,1%) else set tm=%a:~4,2%
- if "%a:~6,1%"=="0" (set td=%a:~7,1%) else set td=%a:~6,2%
- set ty=%a:~0,4%&echo.%a%
- :hanye
- echo n=!n!
- set/a n=%tm%*2,y=%ty%%%4,td=%td%+1,e=!m:~%n%,2!
- echo n=!n!,e=!e!
- pause
- if %tm%==2 if %y%==0 set e=29
- if %td% gtr %e% set/a tm=%tm%+1,td=1
- if %tm%==13 set/a ty=%ty%+1,tm=1
- if %tm% lss 10 (set em=0%tm%) else set em=%tm%
- if %td% lss 10 (set ed=0%td%) else set ed=%td%
- set d=%ty%%em%%ed%
- if %d% gtr %b% pause>nul&goto :eof
- echo.%d%&goto :hanye
复制代码
测试结果:起始日期,格式20071221:18991125
终止日期,格式20080310:20000305
18991125
n=
n=22,e=0
我的代码中用的是如下方式来截取的:- (set /a index=m*2-2)& for %%i in (!index!) do set dmax=!days:~%%i,2!
复制代码
作者: hanyeguxing 时间: 2010-4-8 00:31
原帖由 neorobin 于 2010-4-8 00:17 发表
实质是变量延迟的问题, 调试代码echo off&setlocal enabledelayedexpansion
set/p a=起始日期,格式20071221:
set/p b=终止日期,格式20080310:
set m=寒夜312831303130313130313031孤星
if "%a:~4,1%"=="0" ...
谢谢,第一次是分两行写的,结果后来贪图美观就给和并到一行了,忘记了延迟的问题。。。
作者: neorobin 时间: 2010-4-8 03:15
以下代码同样用 100 年的日期测试, 用时与 7 楼 FOR 的代码极为接近
对输入的日期前后无限制, 可自动将在前的日期作为起始日期
其中 如: if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) 这样的判断语句还可省去, 进一步提高效率, 但未有简洁方案, 太显繁长- @echo off&setlocal enabledelayedexpansion
- set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
- set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
- (set t=%time%)&(cd.>outFile.txt)
- for /l %%m in (1,1,12) do (set days_%%m=31)
- for %%m in (4,6,9,11) do (set days_%%m=30)
- if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
- if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
- if "!ymde!" lss "!ymds!" (set tt=!ymde!)&(set ymde=!ymds!)&(set ymds=!tt!)
- echo 起始日期为:!ymds!, 截止日期为:!ymde!
- (set /a ys=1!ymds:~0,4!-10000, ye=1!ymde:~0,4!-10000)
- (set /a ms=1!ymds:~4,2!-100, me=1!ymde:~4,2!-100)
- (set /a ds=1!ymds:~6,2!-100, de=1!ymde:~6,2!-100)
- set /a "y_1=ys+1,m_1=ms+1,d_1=ds+1"
- for /l %%y in (!ys!,1,!ys!) do (
- (set _y=000%%y)&(set _y=!_y:~-4!)
- for /l %%m in (!ms!,1,!ms!) do (
- (set _m=0%%m)&(set _m=!_m:~-2!)
- if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
- for /l %%d in (!ds!,1,9) do (
- if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
- )
- if !ds! geq 10 (set d_2=!ds!) else set d_2=10
- for /l %%d in (!d_2!,1,!days_%%m!) do (
- if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
- )
- )
- for /l %%m in (!m_1!,1,12) do (
- (set _m=0%%m)&(set _m=!_m:~-2!)
- if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
- for /l %%d in (1,1,9) do (
- if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
- )
- for /l %%d in (10,1,!days_%%m!) do (
- if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
- )
- )
- )>>outFile.txt
- for /l %%y in (!y_1!,1,!ye!) do (
- (set _y=000%%y)&(set _y=!_y:~-4!)
- for /l %%m in (1,1,12) do (
- (set _m=0%%m)&(set _m=!_m:~-2!)
- if %%m==2 set /a "days_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
- for /l %%d in (1,1,9) do (
- if "!_y!!_m!0%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!0%%d
- )
- for /l %%d in (10,1,!days_%%m!) do (
- if "!_y!!_m!%%d" gtr "!ymde!" (goto :break) else echo !_y!!_m!%%d
- )
- )
- )>>outFile.txt
- :break
- echo 用时: !t! ==^> %time%
- start outFile.txt
- pause
- exit /b
复制代码
[ 本帖最后由 neorobin 于 2010-4-8 03:46 编辑 ]
作者: terse 时间: 2010-4-8 04:10
参照日期算法 应该可行 效率没测试
作者: FOR 时间: 2010-4-8 13:52
提速,100 个日期 只需 1.81 秒- @echo off&setlocal enabledelayedexpansion
- set t=%time%
- echo 请输入8位数的起始日期和结束日期用空格分开
- echo 或只输入结束(开始)日期,默认当前日期为起始(结束)日期
- echo 输入格式 20080205 21080529&echo.
- set xx=19100201
- for /f "tokens=1,2" %%i in ("%xx%") do (
- if not "%%j"=="" (set qs=%%i&set js=%%j) else (
- for /f "tokens=1-3 delims=.\-/ " %%a in ("!date!") do (
- if %%a%%b%%c gtr %%i (set/a qs=xx,js=%%a%%b%%c) else (
- set/a qs=%%a%%b%%c,js=%%i
- ))))
- for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do set/a n+=1&set/a yue!n!=%%a
- set /a qsd=100%qs:~4,2%%%100,qsm=100%qs:~6,2%%%100
- set /a yuq=qsd,yuh=12,mq=qsm,mh=yue!qsd!
- echo 起始日期 %qs:~0,4%-%qs:~4,2%-%qs:~6,2%
- echo 结束日期 %js:~0,4%-%js:~4,2%-%js:~6,2%
- for /l %%i in (1 1 31) do set .%%i=0%%i&set ".%%i=!.%%i:~-2!"
- (
- for /l %%i in (%qs:~0,4% 1 %js:~0,4%) do (
- set /a yue2="^!(%%i%%4)&^!(^!(%%i%%100))|^!(%%i%%400)"+28
- if %%i equ %js:~0,4% set /a yuh=100%js:~4,2%%%100&set flag=a
- for /l %%j in (!yuq! 1 !yuh!) do (
- set /a mh=yue%%j
- if defined flag if %%j equ !yuh! set /a mh=100!js:~-2!%%100
- for /l %%k in (!mq! 1 !mh!) do echo %%i!.%%j!!.%%k!
- set /a mq=1&echo;
- )
- set yuq=1
- )
- )>c.txt
- pause
复制代码
作者: hanyeguxing 时间: 2010-4-8 13:55
看楼上各位把for /l用到这境界,羡一个。。。
作者: terse 时间: 2010-4-8 14:30
发现已经迟到一步- @echo off&setlocal enabledelayedexpansion
- set "YmdP=19080521"
- set "YmdT=20110902"
- if "%YmdP%" gtr "%YmdT%" set/a "YmdP=YmdT,YmdT=%YmdP%"
- set /a "p1=%YmdP:~,4%,p2=1%YmdP:~4,2%%%100,p3=1%YmdP:~6,2%%%100,T1=%YmdT:~,4%,T2=1%YmdT:~4,2%%%100,T3=1%YmdT:~6,2%%%100"
- for /l %%i in (%p1% 1 %t1%) do set /a "i%%i=1,j%%i=12"
- set /a "i%p1%=p2,j%t1%=t2"
- for %%i in (31 28 31 30 31 30 31 31 30 31 30 31) do set /a n+=1&set "_n!n!=%%i"
- for /l %%i in (%p1% 1 %t1%) do (
- set /a "_n2=^!(%%i%%4)&^!(^!(%%i%%100))|^!(%%i%%400)+28"
- for /l %%j in (!i%%i! 1 !j%%i!) do (
- set i=1
- if "%%i%%j" equ "!p1!!p2!" set /a "i=p3"
- if "%%i%%j" equ "!t1!!t2!" set /a "_n%%j=t3"
- set "m=0%%j"
- for /l %%k in (!i! 1 !_n%%j!) do (
- set "d=0%%k"
- echo;%%i!m:~-2!!d:~-2!
- )))
- pause
复制代码
作者: FOR 时间: 2010-4-8 15:04
继续提速,减少for循环内代码运行的次数,效率略有提高,测试100个日期耗时1.66秒左右
- @echo off&setlocal enabledelayedexpansion
- set t=%time%
- echo 请输入8位数的起始日期和结束日期用空格分开
- echo 或只输入结束(开始)日期,默认当前日期为起始(结束)日期
- echo 输入格式 20080205 21080529&echo.
- set xx=19100201
- for /f "tokens=1,2" %%i in ("%xx%") do (
- if not "%%j"=="" (set qs=%%i&set js=%%j) else (
- for /f "tokens=1-3 delims=.\-/ " %%a in ("!date!") do (
- if %%a%%b%%c gtr %%i (set/a qs=xx,js=%%a%%b%%c) else (
- set/a qs=%%a%%b%%c,js=%%i
- ))))
- for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do set/a n+=1&set/a yue!n!=%%a
- set /a qsd=100%qs:~4,2%%%100,qsm=100%qs:~6,2%%%100
- set /a yuq=qsd,yuh=12,mq=qsm,mh=yue!qsd!
- for /l %%i in (1 1 31) do set .%%i=0%%i&set ".%%i=!.%%i:~-2!"
- set /a a=100!js:~4,2!%%100,b=100!js:~-2!%%100
- set #2010!a!=!js:~0,4!&set yue!js:~0,4!!a!=!b!
- set _!js:~0,4!=!a!&set yuh!a!=!a!
- echo 起始日期 %qs:~0,4%-%qs:~4,2%-%qs:~6,2%
- echo 结束日期 %js:~0,4%-%js:~4,2%-%js:~6,2%
- (for /l %%i in (%qs:~0,4% 1 %js:~0,4%) do (
- set /a yue2="^!(%%i%%4)&^!(^!(%%i%%100))|^!(%%i%%400)"+28,yuh=yuh!_%%i!
- for /l %%j in (!yuq! 1 !yuh!) do (
- set /a mh=yue!#%%i%%j!%%j
- for /l %%k in (!mq! 1 !mh!) do echo %%i!.%%j!!.%%k!
- set mq=1
- )
- set yuq=1
- ))>c.txt
- pause
复制代码
[ 本帖最后由 FOR 于 2010-4-8 15:06 编辑 ]
作者: neorobin 时间: 2010-4-9 01:18
借鉴各位的技巧和思路,特别是 FOR 的, 再发一个:- @echo off&setlocal enabledelayedexpansion
- set /p ymds=请输入起始日期(yyyymmdd),要使用系统当前日期,请直接回车:
- set /p ymde=请输入截止日期(yyyymmdd),要使用系统当前日期,请直接回车:
- if not defined ymds (set ymds=%date:~0,4%%date:~5,2%%date:~8,2%)
- if not defined ymde (set ymde=%date:~0,4%%date:~5,2%%date:~8,2%)
- if "!ymde!" lss "!ymds!" (set tt=!ymde!&set ymde=!ymds!&set ymds=!tt!)
- echo 起始日期为:!ymds!, 截止日期为:!ymde!
- set /p=%time% ==^><nul
- for /l %%i in (0 1 31) do set _%%i=0%%i&set "_%%i=!_%%i:~-2!"
- (for /l %%m in (1,1,12) do set SD_%%m=31)&for %%m in (4,6,9,11) do set SD_%%m=30
-
- set /a ys=1!ymds:~0,4!-10000, ye=1!ymde:~0,4!-10000
- set /a ms=1!ymds:~4,2!-100, me=1!ymde:~4,2!-100
- set /a ds_diff=1!ymds:~6,2!-101, dEnd=1!ymde:~6,2!-100
-
- (for /l %%y in (%ymds:~0,4% 1 %ymde:~0,4%) do (
- set /a "SD_2=28+(^!(%%y%%4)&^!^!(%%y%%100))|^!(%%y%%400)"
- if %%y gtr !ys! (set ms=1)
- if %%y lss !ye! (
- for /l %%m in (!ms!,1,12) do (
- set /a "ds=1+(^!(%%y^^ys)&^!(%%m^^ms))*ds_diff"
- for /l %%d in (!ds!,1,!SD_%%m!) do echo %%y!_%%m!!_%%d!
- )
- ) else for /l %%m in (!ms!,1,!me!) do (
- set /a "ds=1+(^!(%%y^^ys)&^!(%%m^^ms))*ds_diff"
- if %%m geq !me! (set de=!dEnd!) else (set de=!SD_%%m!)
- for /l %%d in (!ds!,1,!de!) do echo %%y!_%%m!!_%%d!
- )
- ))>out.txt
- echo %time%&start out.txt&pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |