@ECHO OFF
SETLOCAL
:: Get dates
SET /p "startdate=Start date "
SET /p "enddate=End date "
CALL :universal startdateu %startdate%
CALL :universal enddateu %enddate%
:Loop
CALL :nextdate
ECHO Use DATE %selected%
IF "%enddateu%" geq "%startdateu%" GOTO Loop
GOTO :EOF
:nextdate
:: Rebuild "startdateu" in selected format-to-use (MMDDYY programmed)
SET "selected=%startdateu:~2,2%%startdateu:~4,2%%startdateu:~0,2%"
:: bump startdateu
SET /a startdateu=1%startdateu% + 1
IF 1%startdateu:~-2% leq 128 GOTO noteom
IF "%startdateu:~-2%"=="32" GOTO eom
:: short months
IF "%startdateu:~-2%"=="31" FOR %%a IN (04 06 09 11) DO IF "%%a"=="%startdateu:~3,2%" SET /a startdateu+=1&GOTO eom
:: not-Feb
IF "%startdateu:~3,2%" neq "02" GOTO noteom
IF "%startdateu:~-2%"=="30" SET /a startdateu+=2&GOTO eom
:: Only allow Feb 29 if leap year
SET /a startdate=%startdateu:~0,3% %% 4
IF %startdate%==0 GOTO noteom
SET /a startdateu+=3
:eom
SET /a startdateu+=69
IF "%startdateu:~3,2%" equ "13" SET /a startdateu+=8800
:noteom
SET "startdateu=%startdateu:~1%"
GOTO :eof
:: Convert to universal (YYMMDD) format - details depend on desired convention (MMDDYY programmed)
:universal
SET %1=%~2
CALL SET "%1=%%%1:~4,2%%%%%1:~0,2%%%%%1:~2,2%%"
GOTO :eof
这是一种生成此类日期列表的方法 - 您显然没有指定要为您的报告例程提供什么格式,所以我将把修改留给您。
本质上,每个输入的日期都被转换为 yymmdd 格式;选定的日期被转换回准备显示,startdateu 中的通用格式日期递增。为了让数学能力与前 0 年一起使用,1 在前一个日期之前串起来,在增量之后被剥离。
如果新的天数是 28 或更少,那么它不是 eom
如果新的 daynumber 变成 32,那么它就是 eom
如果新的天数变成 31,那么在短短的几个月里,再加上一个 1,变成 32,它就是 eom
如果不是二月,我们不在 eom
否则,如果新的 daynumber 为 30,则加 2 为 32,即为 eom
否则,如果 yearnumber 可以被 4 整除,则不是 eom
否则新的天数必须是 29 所以加 3 就是 32 就是 eom
在 eom 处,将 69 添加到新的天数 69,这将增加月份并设置 day=1。
如果生成的月份数为 13,则添加 8800 以增加年份并使月份 =01。