Благодаря подсказкам из
"шапочного раздела" от
evgeni666 -
·
Использование даты на день раньше чем сегодня (учитываются високосные годы) и от
igor_andreev -
·
Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) "родился" такой вариант (не зависит от формата даты, учитывает високосные годы, можно как прибавлять, так и убавлять передаваемое в качестве параметра количество дней к текущей дате)
[more]
Код: @echo off
if "%1"=="" goto :_NO_ARG
if %1 GTR 40000 goto :_ERR_BIG
if %1 LSS -40000 goto :_ERR_SMALL
rem определим, сколько вычитаем....
Set /A Day_minus=%1
if %Day_minus% GTR 0 echo Вычитаем %Day_minus%
if %Day_minus% LEQ 0 echo Вычитаем %Day_minus% (ну, т.е. прибавляем
)
echo.>"%TEMP%\~.ddf"
makecab /D RptFileName="%TEMP%\~.rpt" /D InfFileName="%TEMP%\~.inf" -f "%TEMP%\~.ddf">nul
rem Определим current-date в формате ГГГГ-Месяц(прописью)-День
for /f "tokens=4,5,7" %%a in ('type "%TEMP%\~.rpt"') do if not defined current-date set "current-date=%%c-%%a-%%b"
rem Если нужно - определим день недели (Mon, Thu и т.д.)
rem for /f "tokens=3" %%a in ('type "%TEMP%\~.rpt"') do if not defined weekday set "weekday=%%a"
del /q "%TEMP%\~.*"
for /f "delims=- tokens=1,2,3" %%i in ("%current-date%") do call :getpackage %%i %%j %%k
rem Собственно, значения....
echo %year%
echo %month%
echo %day%
echo package=%package%
goto :EOF
:_NO_ARG
echo Нет аргумента ... Не буду считать
goto :EOF
:_ERR_BIG
echo выбранное значение %1 больше 40'000 ... Не буду считать
goto :EOF
:_ERR_Small
echo выбранное значение %1 меньше -40'000 ... Не буду считать
goto :EOF
:getpackage
set day=%3
set month=%2
set /a year=%1
rem Преобразуем месяц в число
if /i "%month%"=="Jan" set /a month=1
if /i "%month%"=="Feb" set /a month=2
if /i "%month%"=="Mar" set /a month=3
if /i "%month%"=="Apr" set /a month=4
if /i "%month%"=="May" set /a month=5
if /i "%month%"=="Jun" set /a month=6
if /i "%month%"=="Jul" set /a month=7
if /i "%month%"=="Aug" set /a month=8
if /i "%month%"=="Sep" set /a month=9
if /i "%month%"=="Oct" set /a month=10
if /i "%month%"=="Nov" set /a month=11
if /i "%month%"=="Dec" set /a month=12
set lastdays="31 28 31 30 31 30 31 31 30 31 30 31"
if %day% leq 9 set /a day=%day:~-1%
set /a day=%day%-%Day_minus
rem @echo on
if %Day_minus% GTR 0 GOTO :_PRV_MINUS
if %Day_minus% LEQ 0 GOTO :_PRV_PLUS
rem @echo off
rem организуем цикл, пока день меньше нуля
:_PRV_MINUS
if %day% LEQ 0 set /a month-=1
if "%month%"=="0" set /a month=12,year-=1
set /a isleap="(year%%4)&((year%%100)|(year%%400))"
if "%isleap%"=="0" (
set lastdays=%lastdays:28=29%
) else (
set lastdays=%lastdays:29=28%
)
if %day% LEQ 0 for /f "tokens=%month%" %%i in (%lastdays%) do set /a day=%%i+%day%
if %day% LEQ 0 GOTO :_PRV_MINUS
GOTO :_PRV_END
rem организуем цикл, пока день больше последнего в месяце
:_PRV_PLUS
set /a isleap="(year%%4)&((year%%100)|(year%%400))"
if "%isleap%"=="0" set lastdays=%lastdays:28=29%
for /f "tokens=%month%" %%i in (%lastdays%) do set /a lastdaym=%%i
if %day% GTR %lastdaym% set /a month+=1
if %day% GTR %lastdaym% set /a day=%day%-%lastdaym%
if "%month%"=="13" set /a month=1,year+=1
set /a isleap="(year%%4)&((year%%100)|(year%%400))"
if "%isleap%"=="0" (
set lastdays=%lastdays:28=29%
) else (
set lastdays=%lastdays:29=28%
)
for /f "tokens=%month%" %%i in (%lastdays%) do set /a lastdaym=%%i
if %day% GTR %lastdaym% GOTO :_PRV_PLUS
:_PRV_END
if %day% leq 9 set day=0%day%
if %month% leq 9 set month=0%month%
set package=%year%-%month%-%day%