Скрипт cmd bat минус плюс Год Месяц День

Для ОС Windows
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 548
Стаж: 3 года 9 месяцев
Откуда: Вологодская область
Поблагодарили: 24 раза
Контактная информация:

Скрипт cmd bat минус плюс Год Месяц День

Сообщение Артём Мамзиков »

Как вычесть (отнять) Год или прибавить Год ?

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
TITLE YEAR

:: Переменная прибавить или отнять указываем + или -
set action=-
:: Кол-во Лет/Год
set numy=5

:: Разбиваем дату 
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (математическое действие)
set /a y=%date:~6,4% %action%%numy%
:: Проверка если текущее число 29.02 а после обычный год то 01.03
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)
:: Получаем
echo %y%.%m%.%d%
pause
СКАЧАТЬ
date-year.zip
date-year.zip
(528 байт) 6 скачиваний
Вместо 5 лет можно использовать любое другое значение + 4 , - 3 и тд.


Как вычесть или прибавить N месяцев ?
::Месяц
set /a m=%date:~3,2% -5
Так сработает если текущий месяц больше вычитаемого, а если меньше или равен вычитаемому не сработает

5-5=0 (по сути это 12 месяц) еще и минус год нужно отнять
5-6=-1 это 11 месяц минус 1 год
А если нужно отнять больше 12 месяцев например 61 или на оборот прибавить как быть?
Расчеты
Показать
Минус *месяцев
1-12=-11 ноябрь
2-12=-10 октябрь
3-12=-9 сентябрь
4-12=-8 август
5-12=-7 июль
6-12=-6 июнь
7-12=-5 май
8-12=-4 апрель
9-12=-3 март
10-12=-2 февраль
11-12=-1 январь
12-12=0 декабрь (-1год)


1-6=-5 июль
2-6=-4 август
3-6=-3 сентябрь
4-6=-2 октябрь
5-6=-1 ноябрь
6-6=0 декабрь

можно сразу делать текущий месяц+12 и вычитать нужный, но при условии что месяцев не будет больше 12.

Узнать количество годов/лет если указанно больше 12 месяцев
текущее количество месяцев : 12 = округляем до целого числа
31:12=2.58=2 года
Получим в месяцах
12*2=24
Вычислим количество месяцев которое нужно отнять от текущих
31-24=7 месяцев отнять от текущего месяца
Вышло что 31 месяц это 2 года 7 месяцев

Если текущий месяц 5 а у нас минус 7 нужно вычесть еще 1 год
текущий месяц 5 - 7 = -2 меньше или равно 0 ? Да -1год Нет 0
получаем -1 год

Чтобы сразу получить положительное число месяцев
текущий месяц + 12 месяцев
5+12=17
И теперь отнимаем наши 7 месяцев
17-7=10 октябрь
текущий год - 2 года и еще -1
2022-2=2020-1=2019

Получаем что 05.2022 - 31 месяц это = 10.2019


Узнать количество годов/лет если указанно больше 12 месяцев
текущее количество месяцев : 12 = округляем до целого числа
61:12=5.08=5 лет
Получим в месяцах
12*5=60
Вычислим количество месяцев которое нужно отнять от текущих
61-60=1 месяцев отнять от текущего месяца
Вышло что 61 месяц это 5 лет 1 месяц
Если текущий месяц 5 а у нас минус 1
текущий месяц 5 - 1 = 4 меньше или равно 0 ? Да -1год Нет 0
получаем 0 год

Чтобы сразу получить положительное число месяцев
текущий месяц + 12 месяцев
5+12=17
И теперь отнимаем наши 7 месяцев
17-1=16 ????
Нужно значит добавить :: Условие текущий месяц меньше вычитаемому то +12 если нет то просто текущий вычитаем полученое значение

текущий год - 5 лет и еще -0
2022-5=2017-0=2017

Получаем что 05.2022 - 61 месяц это = 01.2017


Прибавления N месяцев
Условия для сложения например у нас текущий месяц 5
5+1=6
5+2=7
5+3=8
5+4=9
5+5=10
5+6=11
5+7=12

5+8=13
5+9=14
5+10=15
5+11=16
5+12=17

Делаем условие если значение больше 12 то полученное значение -12
13-12=1
14-12=2
15-12=3
16-12=4
17-12=5

Проверка у полученного месяца есть такое число если проверка выпала на коней месяца, если нет подставляем максимальное число для получаемого месяца
bat скрипт С ВЫВОДОМ ОПИСАНИЯ РАСЧЕТОВ МИНУС N месяцев задаем в переменной set monthval=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 01.05.2022
TITLE mount

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Переменная вычитаем кол-во месяцев
set monthval=16
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
echo года/лет: %monthval%/12=%yearval%
:: Получим в месяцах
set /a minmonth=12*%yearval%
echo Значение в месяцах: 12*%yearval%=%minmonth%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текущих
set /a resmonth=%monthval%-%minmonth%
echo Получаем кол-во месяцев для расчетов %monthval%-%minmonth%=%resmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%-%resmonth%
echo %m%-%resmonth%=%mvr% меньше или равно 0 ? Да -1год Нет 0
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)
echo %yearjd%

:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем получение значение
echo Условие текущий месяц %m% меньше или равно %resmonth% ?
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)
echo Если меньше получаем Положительное количество месяцев %m%+12=%posmonth%
echo Вычитаем полученные месяцы %posmonth%-%resmonth%=%receivedmonth%
echo Если больше из текущего месяца вычитаем полученный %m%-%resmonth%=%receivedmonth%

::Получаем год текущий год -%yearval%-%yearjd%
set /a receivedyear=%y%-%yearval%-%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%

set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
echo %d% больше %numdaymonth% ? d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
echo %y%.%m%.%d%
pause
СКАЧАТЬ
MOUNT-MINUS-ECHO.zip
MOUNT-MINUS-ECHO.zip
(1.42 КБ) 5 скачиваний
bat скрипт БЕЗ ВЫВОДА ОПИСАНИЯ РАСЧЕТОВ МИНУС N месяцев задаем в переменной set monthval=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 01.05.2022
TITLE month

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Переменная кол-во месяцев
set monthval=16
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
:: Получим в месяцах
set /a minmonth=12*%yearval%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текущих
set /a resmonth=%monthval%-%minmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%-%resmonth%
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)

:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем полученное значение
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)

::Получаем год текущий год -%yearval%-%yearjd%
set /a receivedyear=%y%-%yearval%-%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%

set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
echo %y%.%m%.%d%
pause
СКАЧАТЬ
MOUNT-MINUS.zip
MOUNT-MINUS.zip
(1.27 КБ) 5 скачиваний
bat скрипт С ВЫВОДОМ ОПИСАНИЯ РАСЧЕТОВ переменная set action= - ИЛИ + N месяцев задаем в переменной set monthval=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.5 02.05.2022
TITLE month

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Переменная прибавить к текущей дате или отнять указываем + или -
set action=-
:: Переменная кол-во месяцев
set monthval=42
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
echo года/лет: %monthval%/12=%yearval%
:: Получим в месяцах
set /a minmonth=12*%yearval%
echo Значение в месяцах: 12*%yearval%=%minmonth%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текущих
set /a resmonth=%monthval%-%minmonth%
echo Получаем кол-во месяцев для расчетов %monthval%-%minmonth%=%resmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%%action%%resmonth%

:: Условие для вычитания - или сложения +
IF %action% == + (goto :additionmonth) ELSE (goto :subtractionmonth)

:additionmonth
:: Условия для сложения текущий месяц + прибавленный не должно быть больше 12 ( %msum% меньше или равно 12)
set /a msum=%m%+%resmonth%
echo %m%+%resmonth%=%msum% меньше или равно 12
IF %msum% LEQ 12 (
:: Текущий плюс полученный
set /a receivedmonth=%m%+%resmonth%) ELSE (
:: Текущий плюс полученный - 12
set /a receivedmonth=%m%+%resmonth%-12)
echo %m%%action%%resmonth%=%mvr% больше 12 ? Да +1 год Нет 0
IF %mvr% GTR 12 (set yearjd=1) ELSE (set yearjd=0)
echo %yearjd%
goto :dalee

:subtractionmonth
:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем полученное значение
echo Условие текущий месяц %m% меньше или равно %resmonth% ?
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)
echo Если меньше получаем Положительное количество месяцев %m%+12=%posmonth%
echo Вычитаем полученные месяцы %posmonth%-%resmonth%=%receivedmonth%
echo Если больше из текущего месяца вычитаем полученный %m%-%resmonth%=%receivedmonth%
echo %m%%action%%resmonth%=%mvr% меньше или равно 0 ? Да -1год Нет 0
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)
echo %yearjd%
goto :dalee

:dalee
::Получаем год текущий год %action%%yearval%%action%%yearjd%
set /a receivedyear=%y%%action%%yearval%%action%%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%
set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
echo %d% больше %numdaymonth% ? d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
echo %y%.%m%.%d%
pause

:end
СКАЧАТЬ
MOUNT-MINUS-PLUS-ECHO.zip
MOUNT-MINUS-PLUS-ECHO.zip
(1.63 КБ) 5 скачиваний
bat скрипт БЕЗ ВЫВОДА ОПИСАНИЯ РАСЧЕТОВ переменная set action= - ИЛИ + N месяцев задаем в переменной set monthval=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.5 02.05.2022
TITLE month

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Переменная прибавить к текущей дате или отнять указываем + или -
set action=-
:: Переменная кол-во месяцев
set monthval=42
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
:: Получим в месяцах
set /a minmonth=12*%yearval%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текуших
set /a resmonth=%monthval%-%minmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%%action%%resmonth%

:: Условие для вычитания - или сложения +
IF %action% == + (goto :additionmonth) ELSE (goto :subtractionmonth)

:additionmonth
:: Условия для сложения текущий месяц + прибавленый не должно быть больше 12 ( %msum% меньше или равно 12)
set /a msum=%m%+%resmonth%
IF %msum% LEQ 12 (
:: Текущий плюс полученный
set /a receivedmonth=%m%+%resmonth%) ELSE (
:: Текущий плюс полученный - 12
set /a receivedmonth=%m%+%resmonth%-12)
IF %mvr% GTR 12 (set yearjd=1) ELSE (set yearjd=0)
goto :dalee

:subtractionmonth
:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем полученое значение
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)
goto :dalee

:dalee
::Получаем год текущий год %action%%yearval%%action%%yearjd%
set /a receivedyear=%y%%action%%yearval%%action%%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%
set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
echo %y%.%m%.%d%
pause

:end
СКАЧАТЬ
MOUNT-MINUS-PLUS.zip
MOUNT-MINUS-PLUS.zip
(1.47 КБ) 4 скачивания
Далее в Днях
уже был скрипт минус 1 день Минус один день.bat
Попробуем сделать вычитание и сложение в различном количестве дней.
Самое простое, это отнять текущее число от общего кол-ва дней и дальше из общего кол-ва дней вычитать днями месяца пока не получим отрицательное значение или 0. Относительно более долгий вариант.

bat скрипт С ВЫВОДОМ РАСЧЕТОВ МИНУС N Дней задаем в переменной set remainingdays=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 02.05.2022
TITLE day
::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Кол-во дней
set remainingdays=830

:: Если ко-во дней уже 0, выводим результат (текущую дату данного этапа)
if %remainingdays% == 0 goto :result
:: Вычитаем из кол-ва дней текущее число (убираем не полный месяц)
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result

:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end

:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %remainingdays%
echo Получаем для года месяца и дней %d%.%m%.%y%

pause
:end
СКАЧАТЬ
DAY-MINUS-ECHO.zip
DAY-MINUS-ECHO.zip
(938 байт) 5 скачиваний
bat скрипт С ВЫВОДОМ РАСЧЕТОВ ПЛЮС N Дней задаем в переменной set remainingdays=

Код: Выделить всё

@echo off
mode con:cols=130 lines=300
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 02.05.2022
TITLE day
::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Кол-во дней
set remainingdays=365

:: Если ко-во дней уже 0, выводим результат (текущую дату данного этапа)
if %remainingdays% == 0 goto :result
::  Прибавляем кол-ву дней текущее число
set /a remainingdays+=%d%
echo Предыдущее значение+%d%=%remainingdays% для %m%.%y%
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
if %m:~0,1%==0 set m=%m:~1%
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set maxday=%%i
:: Остановка Если значение не больше числа для текущего месяца выводим результат, если больше убираем не полный месяц (+1 месяц)
if %remainingdays% LEQ %maxday% ( set d=%remainingdays%& goto :result) else ( set /a remainingdays-=%maxday%)
echo Осталось дней %remainingdays%

:cycle
:: Плюс 1 месяц
set /a m+=1
:: Если месяц 12+1=13 значит месяц 1 и +1 год
if %m%==13 set m=1
if %m%==1 set /a y+=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 set d=1& goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set /a d=%d%%remainingdays%& goto :result
:: Возвращаемся
call :cycle
goto :end

:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %remainingdays%
echo Получаем для года месяца и дней %d%.%m%.%y%

pause
:end
СКАЧАТЬ
DAY-PLUS-ECHO.zip
DAY-PLUS-ECHO.zip
(1.01 КБ) 9 скачиваний
ВСЕ РАЗОМ В ОДНОМ СКРИПТЕ
bat скрипт С ВЫВОДОМ ОПИСАНИЯ РАСЧЕТОВ МИНУС/ПЛЮС N ЛЕТ МЕСЯЦЕВ ДНЕЙ

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 3.0 15.05.2022
TITLE year month day


:: Переменная прибавить к текущей дате или отнять указываем + или -
set action=-
:: Если прибавлять или вычитать не нужно ставим 0
:: Переменная кол-во год(а)/лет
set god=1
:: Переменная кол-во месяцев
set monthval=24
:: Переменная кол-во дней
set dayval=10

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set /a y=%date:~6,4% %action%%god%
echo для текущего года %date:~6,4% %action%%god%=%y%
:: Проверка если текущее число 29.02 а после обычный год то 01.03
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)
echo Получаем для года %d%.%m%.%y%
pause

:: Если для расчета месяца переменная 0 даный блок выполнять не будем
IF %monthval% NEQ 0 (goto :month) ELSE (goto :day)

:month
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
echo года/лет: %monthval%/12=%yearval%
:: Получим в месяцах
set /a minmonth=12*%yearval%
echo Значение в месяцах: 12*%yearval%=%minmonth%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текуших
set /a resmonth=%monthval%-%minmonth%
echo Получаем кол-во месяцев для расчетов %monthval%-%minmonth%=%resmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%%action%%resmonth%

:: Условие для вычитания - или сложения +
IF %action% == + (goto :additionmonth) ELSE (goto :subtractionmonth)

:additionmonth
:: Условия для сложения текущий месяц + прибавленый не должно быть больше 12 ( %msum% меньше или равно 12)
set /a msum=%m%+%resmonth%
echo %m%+%resmonth%=%msum% меньше или равно 12
IF %msum% LEQ 12 (
:: Текущий плюс полученный
set /a receivedmonth=%m%+%resmonth%) ELSE (
:: Текущий плюс полученный - 12
set /a receivedmonth=%m%+%resmonth%-12)
echo %m%%action%%resmonth%=%mvr% больше 12 ? Да +1 год Нет 0
IF %mvr% GTR 12 (set yearjd=1) ELSE (set yearjd=0)
echo %yearjd%
goto :resultmonth

:subtractionmonth
:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем полученое значение
echo Условие текущий месяц %m% меньше или равно %resmonth% ?
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)
echo Если меньше получаем Положительное количество месяцев %m%+12=%posmonth%
echo Вычитаем полученные месяцы %posmonth%-%resmonth%=%receivedmonth%
echo Если больше из текущего месяца вычитаем полученный %m%-%resmonth%=%receivedmonth%
echo %m%%action%%resmonth%=%mvr% меньше или равно 0 ? Да -1год Нет 0
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)
echo %yearjd%
goto :resultmonth

:resultmonth
::Получаем год текущий год %action%%yearval%%action%%yearjd%
set /a receivedyear=%y%%action%%yearval%%action%%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%
set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
echo Получаем для года и месяца %d%.%m%.%y%
pause


:day
:: Если для расчета дней переменная 0 даный блок выполнять не будем
IF %dayval% == 0 (goto :datecalculationcompleted)
:: Сложение или вычитание
if %action% == - ( goto :dayminus) else ( goto :dayplus)

:dayminus
:: Вычитаем из кол-ва дней текущее число (убираем не полный месяц)
set /a dayval-=%d%
echo Предыдущее значение-%d%=%dayval% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %dayval% LSS 0 set d=%dayval:~1%& goto :result
:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %dayval% == 0 goto :result
:: Вычитаем месяц в днях
set /a dayval-=%d%
echo Предыдущее значение-%d%=%dayval% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %dayval% LSS 0 set d=%dayval:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end

:dayplus
::  Прибавляем кол-ву дней текущее число
set /a dayval+=%d%
echo Предыдущее значение+%d%=%dayval% для %m%.%y%
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
if %m:~0,1%==0 set m=%m:~1%
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set maxday=%%i
:: Остановка Если значение не больше числа для текущего месяца выводим результат, если больше убираем не полный месяц (+1 месяц)
if %dayval% LEQ %maxday% ( set d=%dayval%& goto :result) else ( set /a dayval-=%maxday%)
echo Осталось дней %dayval%
:cycleplus
:: Плюс 1 месяц
set /a m+=1
:: Если месяц 12+1=13 значит месяц 1 и +1 год
if %m%==13 set m=1
if %m%==1 set /a y+=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %dayval% == 0 set d=1& goto :result
:: Вычитаем месяц в днях
set /a dayval-=%d%
echo Предыдущее значение-%d%=%dayval% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %dayval% LSS 0 set /a d=%d%%dayval%& goto :result
:: Возвращаемся
call :cycleplus
goto :end

:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %dayval%

:datecalculationcompleted
:: Получаем дату
echo Получаем для года месяца и дней %d%.%m%.%y%
pause

:end
СКАЧАТЬ
YEAR-MOUNT-DAY-MINUS-PLUS-ECHO.zip
YEAR-MOUNT-DAY-MINUS-PLUS-ECHO.zip
(2.29 КБ) 2 скачивания

ЕЩЁ НЕСКОЛЬКО ВАРИАНТОВ ДЛЯ КОЛ-ВА ДНЕЙ

Вначале рассчитаем большие значения на кол-во лет, после оставшееся значение дней (меньше 365 дней) рассчитаем как обычно.

ПЕРВЫЙ ВАРИАНТ вычитание года идет сразу далее корректировка в блоке onetwothree расчеты идут с плюсом + к текущей дате сразу.

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 02.05.2022 (вычитание года идет сразу далее корректировка в блоке onetwothree расчеты идут с плюсом + к текущей дате сразу)
TITLE day

:: Переменная кол-во дней
set dayval=930

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Получим кол-во годов целое число
set /a kolyear=%dayval%/365
echo кол-во годов %dayval%/365=%kolyear%

:: Вычитаем/прибавим от текущего года
set /a y=%y%-%kolyear%

:: Полученное кол-во делим на 4 для расчетов високосный не високосный год
set /a kolleapyear=%kolyear%/4
echo кол-во високосных г. %kolyear%/4=%kolleapyear%
:: Из общего кол-ва вычитаем високосные, получаем кол-во обычных г.
set /a kolnormyear=%kolyear%-%kolleapyear%
echo кол-во обычных г. %kolyear%-%kolleapyear%=%kolnormyear%

:: Високосные года умножим на 366 дней, и получим кол-во дней для високосных годов
set /a kolleapday=%kolleapyear%*366
echo кол-во дней високосных г. %kolleapyear%*366=%kolleapday%
:: Обычные года умножим на 365, и получим кол-во дней для обычных годов
set /a kolnormday=%kolnormyear%*365
echo кол-во дней обычных г. %kolnormyear%*365=%kolnormday%

:: Суммируем дни
set /a sumday=%kolleapday%+%kolnormday%
echo сумма дней %kolleapday%+%kolnormday%=%sumday%

:: Теперь узнаем точное оставшихся для расчета дней
set /a remainingdays=%dayval%-%sumday%
echo точное кол-во дней для расчета %dayval%-%sumday%=%remainingdays%


:: Если проверяемые дни меньше 4 лет но от 1-3 года, может быть что в этом периоде есть високосный год тогда нужно вернуть +1 день при условии что дата больше 28.02
if %kolleapyear% == 0 (
if %kolnormyear% LEQ 3 (
if %kolnormyear% GEQ 1 (for /L %%x in (1,1,%kolnormyear%) do set provg=%%x& call:onetwothree) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue)
goto :checkingnegativevalue

:onetwothree
:: %Деление по модулю является остаток от целочисленного деления, високосный будет 0=0 значит возвращаем +1 день
set /a vg=(%y%+%provg%-1)%%4
echo %y%+%provg%-1
echo %vg% == 0 ?
if %vg% == 0 (
if 1 == %provg% (
if %m%%d% LSS 0301 set /a d+=1
) else ( set /a d+=1)
)
:: else ( goto :end)
echo +1 день ? %d%.%m%.%y%
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Для текущего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 32 число больше чем может быть, +1 месяц и 1 число месяца
if %d% GTR %numdaymonth% set /a m+=1& set d=1
:: Если 12+1=13 это 1 месяц +1 год
if %m%==13 set m=1& set /a y+=1
pause
goto :end

:checkingnegativevalue
:: В некоторых случаях получаем погрешность например: 3285-3287=-2 и -1 условие меньше 0 вернем обратно +1 год и от 365(6) -2 или -1
:: Если обычных 3 6 9, а високосных 1 2 3  9:3=3 при результате 3 количество дней для погрешности будет 366 для всех других 365 , но так как деления с остатком нет будем делить и снова умножать и сравнивать число до деления если сходятся проверяем
:: Переменная для 0 (года)
set pr=1
:: Переменная по умолчанию для обычного года
set inaccuracy=365
:: Обычные делим на високосные
set /a pr=%kolnormyear%/%kolleapyear%
echo %kolnormyear%/%kolleapyear%=%pr% если 0 то 366, если нет 365 (для погрешности)
:: Умножаем обратно для проверки то что деление без остатка
set /a checdivision=%pr%*%kolleapyear%
echo проверка деления без остатка %pr%*%kolleapyear% = %checdivision% == %kolnormyear% ?
:: Если до деления и после возврата числа одинаковые значит деление без остатка
if %checdivision% == %kolnormyear% (
if %pr% == 3 set inaccuracy=366)
echo для погрешности %inaccuracy%%remainingdays%=  и +1 год
:: При отрицательных днях 366 -2 или -1 и +1год
if %remainingdays% LSS 0 set /a y=%y%+1 & set /a remainingdays=%inaccuracy%%remainingdays%
::Если после вычитания года осталось число 29.02 а год обычный проверим
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)

echo промежуточное кол-во дней меньше 365 оставшиеся: %remainingdays% год %d%.%m%.%y%

:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Если ко-во дней уже 0, выводим результат (текущую дату данного этапа)
if %remainingdays% == 0 goto :result
:: Вычитаем из кол-ва дней текущее число (убираем не полный месяц)
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result

:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end


:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %remainingdays%
echo Получаем для года месяца и дней %d%.%m%.%y%

pause
:end
СКАЧАТЬ
day.zip
day.zip
(2.28 КБ) 6 скачиваний
ВТОРОЙ ВАРИАНТ в расчетах год сделан отдельной переменной kolyear в блоке onetwothree расчеты идут с - минусом сразу к дате, вычитание года y-=%kolyear% после расчетов

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 02.05.2022 (в расчетах год сделан отдельной переменной kolyear в блоке onetwothree расчеты идут с - минусом сразу к дате, вычитание года y-=%kolyear% после расчетов)
TITLE day

:: Переменная кол-во дней
set dayval=930

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%


:: Получим кол-во годов целое число
set /a kolyear=%dayval%/365
echo кол-во годов %dayval%/365=%kolyear%

:: Полученное кол-во делим на 4 для расчетов високосный не високосный год
set /a kolleapyear=%kolyear%/4
echo кол-во високосных г. %kolyear%/4=%kolleapyear%
:: Из общего кол-ва вычитаем високосные, получаем кол-во обычных г.
set /a kolnormyear=%kolyear%-%kolleapyear%
echo кол-во обычных г. %kolyear%-%kolleapyear%=%kolnormyear%

:: Високосные года умножим на 366 дней, и получим кол-во дней для високосных годов
set /a kolleapday=%kolleapyear%*366
echo кол-во дней високосных г. %kolleapyear%*366=%kolleapday%
:: Обычные года умножим на 365, и получим кол-во дней для обычных годов
set /a kolnormday=%kolnormyear%*365
echo кол-во дней обычных г. %kolnormyear%*365=%kolnormday%

:: Суммируем дни
set /a sumday=%kolleapday%+%kolnormday%
echo сумма дней %kolleapday%+%kolnormday%=%sumday%

:: Теперь узнаем точное оставшихся для расчета дней
set /a remainingdays=%dayval%-%sumday%
echo точное кол-во дней для расчета %dayval%-%sumday%=%remainingdays%


:: Если проверяемые дни меньше 4 лет но от 1-3 года, может быть что в этом периоде есть високосный год тогда нужно вернуть +1 день при условии что дата больше 28.02
if %kolleapyear% == 0 (
if %kolnormyear% LEQ 3 (
if %kolnormyear% GEQ 1 (for /L %%x in (1,1,%kolnormyear%) do set provg=%%x& call:onetwothree) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue)
goto :checkingnegativevalue

:onetwothree
:: %Деление по модулю является остаток от целочисленного деления, високосный будет 0=0 значит возвращаем +1 день
set /a vg=(%y%-%provg%)%%4
echo %y%-%provg%
echo %vg% == 0 ?
if %vg% == 0 (
if %kolnormyear% == %provg% (
if %m%%d% LSS 0301 set /a d+=1
) else ( set /a d+=1)
)
:: else ( goto :end)
echo +1 день ? %d%
:: %Деление по модулю является остаток от целочисленного деления
set /a feb=(%y%-%kolyear%)%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Для текущего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 32 число больше чем может быть, +1 месяц и 1 число месяца
if %d% GTR %numdaymonth% set /a m+=1& set d=1
:: Если 12+1=13 это 1 месяц +1 год
if %m%==13 set m=1& set /a kolyear+=1
pause
goto :end

:checkingnegativevalue
:: В некоторых случаях получаем погрешность например: 3285-3287=-2 и -1 условие меньше 0 вернем обратно +1 год и от 365(6) -2 или -1
:: Если обычных 3 6 9, а високосных 1 2 3  9:3=3 при результате 3 количество дней для погрешности будет 366 для всех других 365 , но так как деления с оcтатком нет будем делить и снова умножать и сравнивать число до деления если сходятся проверяем
:: Переменная для 0 (года)
set pr=1
:: Переменная по умолчанию для обычного года
set inaccuracy=365
:: Обычные делим на високосные
set /a pr=%kolnormyear%/%kolleapyear%
echo %kolnormyear%/%kolleapyear%=%pr% если 0 то 366, если нет 365 (для погрешности)
:: Умножаем обратно для проверки то что деление без остатка
set /a checdivision=%pr%*%kolleapyear%
echo проверка деления без остатка %pr%*%kolleapyear% = %checdivision% == %kolnormyear% ?
:: Если до деления и после возврата числа одинаковые значит деление без остатка
if %checdivision% == %kolnormyear% (
if %pr% == 3 set inaccuracy=366)
echo для погрешности %inaccuracy%%remainingdays%=  и +1 год
:: При отрицательных днях 366 -2 или -1 и +1год
if %remainingdays% LSS 0 set /a kolyear+=1 & set /a remainingdays=%inaccuracy%%remainingdays%

:: Вычитаем/прибавим от текущего года
set /a y-=%kolyear%

::Если после вычитания года осталось число 29.02 а год обычный проверим
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)


echo промежуточное кол-во дней меньше 365 оставшиеся: %remainingdays% год %d%.%m%.%y%

:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Если ко-во дней уже 0, выводим результат (текущую дату данного этапа)
if %remainingdays% == 0 goto :result
:: Вычитаем из кол-ва дней текущее число (убираем не полный месяц)
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result

:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end


:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %remainingdays%
echo Получаем для года месяца и дней %d%.%m%.%y%

pause

:end
СКАЧАТЬ
day2.zip
day2.zip
(2.31 КБ) 5 скачиваний
ТРЕТИЙ ВАРИАНТ в расчетах год сделан отдельной переменной kolyear в блоке onetwothree расчеты идут с - минусом к остатку дней расчетов remainingdays, вычитание даты после расчетов

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 02.05.2022 (в расчетах год сделан отдельной переменной kolyear в блоке onetwothree расчеты идут с - минусом к остатку дней расчетов remainingdays, вычитание даты после расчетов)
TITLE day


:: Переменная кол-во дней
set dayval=930

::Текущая дата
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год
set y=%date:~6,4%

:: Получим кол-во годов целое число
set /a kolyear=%dayval%/365
echo кол-во годов %dayval%/365=%kolyear%

:: Полученное кол-во делим на 4 для расчетов високосный не високосный год
set /a kolleapyear=%kolyear%/4
echo кол-во високосных г. %kolyear%/4=%kolleapyear%
:: Из общего кол-ва вычитаем високосные, получаем кол-во обычных г.
set /a kolnormyear=%kolyear%-%kolleapyear%
echo кол-во обычных г. %kolyear%-%kolleapyear%=%kolnormyear%

:: Високосные года умножим на 366 дней, и получим кол-во дней для високосных годов
set /a kolleapday=%kolleapyear%*366
echo кол-во дней високосных г. %kolleapyear%*366=%kolleapday%
:: Обычные года умножим на 365, и получим кол-во дней для обычных годов
set /a kolnormday=%kolnormyear%*365
echo кол-во дней обычных г. %kolnormyear%*365=%kolnormday%

:: Суммируем дни
set /a sumday=%kolleapday%+%kolnormday%
echo сумма дней %kolleapday%+%kolnormday%=%sumday%

:: Теперь узнаем точное оставшихся для расчета дней
set /a remainingdays=%dayval%-%sumday%
echo точное кол-во дней для расчета %dayval%-%sumday%=%remainingdays%


:: Если проверяемые дни меньше 4 лет но от 1-3 года, может быть что в этом периоде есть високосный год тогда нужно вернуть +1 день при условии что дата больше 28.02
if %kolleapyear% == 0 (
if %kolnormyear% LEQ 3 (
if %kolnormyear% GEQ 1 (for /L %%x in (1,1,%kolnormyear%) do set provg=%%x& call:onetwothree) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue)
goto :checkingnegativevalue

:onetwothree
:: %Деление по модулю является остаток от целочисленного деления, високосный будет 0=0 значит возвращаем +1 день
set /a vg=(%y%-%provg%)%%4
echo %y%-%provg%
echo %vg% == 0 ?
if %vg% == 0 (
if %kolnormyear% == %provg% (
if %m%%d% LSS 0301 set /a remainingdays+=1
) else ( set /a remainingdays+=1)
)
goto :end

:checkingnegativevalue
:: В некоторых случаях получаем погрешность например: 3285-3287=-2 и -1 условие меньше 0 вернём обратно +1 год и от 365(6) -2 или -1
:: Если обычных 3 6 9, а високосных 1 2 3  9:3=3 при результате 3 количество дней для погрешности будет 366 для всех других 365 , но так как деления с остатком нет будем делить и снова умножать и сравнивать число до деления если сходятся проверяем
:: Переменная для 0 (года)
set pr=1
:: Переменная по умолчанию для обычного года
set inaccuracy=365
:: Обычные делим на високосные
set /a pr=%kolnormyear%/%kolleapyear%
echo %kolnormyear%/%kolleapyear%=%pr% если 0 то 366, если нет 365 (для погрешности)
:: Умножаем обратно для проверки то что деление без остатка
set /a checdivision=%pr%*%kolleapyear%
echo проверка деления без остатка %pr%*%kolleapyear% = %checdivision% == %kolnormyear% ?
:: Если до деления и после возврата числа одинаковые значит деление без остатка
if %checdivision% == %kolnormyear% (
if %pr% == 3 set inaccuracy=366)
echo для погрешности %inaccuracy%%remainingdays%=  и +1 год
:: При отрицательных днях 366 -2 или -1 и +1год
if %remainingdays% LSS 0 set /a kolyear+=1 & set /a remainingdays=%inaccuracy%%remainingdays%

:: Вычитаем/прибавим от текущего года
set /a y-=%kolyear%

::Если после вычитания года осталось число 29.02 а год обычный проверим
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)


echo промежуточное кол-во дней меньше 365 оставшиеся: %remainingdays% год %d%.%m%.%y%

:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: День Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если дата 01 то будет 1
if %d:~0,1%==0 set d=%d:~1%
:: Если ко-во дней уже 0, выводим результат (текущую дату данного этапа)
if %remainingdays% == 0 goto :result
:: Вычитаем из кол-ва дней текущее число (убираем не полный месяц)
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result

:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end


:result
:: Получаем дату
set d=0%d%
set m=0%m%
set d=%d:~-2%
set m=%m:~-2%
echo Кол-во дней %remainingdays%
echo Получаем для года месяца и дней %d%.%m%.%y%

pause

:end
СКАЧАТЬ
day3.zip
day3.zip
(2.18 КБ) 6 скачиваний
СКАЧАТЬ ВСЕ РАЗОМ
Вычитание-Сложение Лет Месяцев Дней.zip
Вычитание-Сложение Лет Месяцев Дней.zip
(18.04 КБ) 4 скачивания
количество слов: 4226
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 548
Стаж: 3 года 9 месяцев
Откуда: Вологодская область
Поблагодарили: 24 раза
Контактная информация:

Скрипт cmd bat минус плюс Год Месяц День

Сообщение Артём Мамзиков »

Начало как это все было для расчетов в днях....

3года - 365 дней
4-ый год - 366 дней

4года=1461день :365=4
365*4=1460
1461-1461=1високосный
2922

Для 1095 дней
кол-во годов 1095/365=3
кол-во високосных г. 3/4=0
кол-во обычных г. 3-0=3
кол-во дней високосных г. 0*366=0
кол-во дней обычных г. 3*365=1095
сумма дней 0+1095=1095
Ошибка деления на ноль.
3/0=1 если 0 то 366, если нет 365 (для погрешности)
для погрешности 3650= и +1 год
точное кол-во дней для расчета 1095-1095=0
Получаем для года месяца и дней 5.05.2019

Для 1461 дней
кол-во годов 1461/365=4
кол-во високосных г. 4/4=1
кол-во обычных г. 4-1=3
кол-во дней високосных г. 1*366=366
кол-во дней обычных г. 3*365=1095
сумма дней 366+1095=1461
3/1=0 если 0 то 366, если нет 365 (для погрешности)

Для 2922 дней
кол-во годов 2922/365=8
кол-во високосных г. 8/4=2
кол-во обычных г. 8-2=6
кол-во дней високосных г. 2*366=732
кол-во дней обычных г. 6*365=2190
сумма дней 732+2190=2922
6/2=0 если 0 то 366, если нет 365 (для погрешности)

+
Для 3284 дней
кол-во годов 3284/365=8
кол-во високосных г. 8/4=2
кол-во обычных г. 8-2=6
кол-во дней високосных г. 2*366=732
кол-во дней обычных г. 6*365=2190
сумма дней 732+2190=2922
точное кол-во дней для расчета 3284-2922=362

-
Для 3285 дней
кол-во годов 3285/365=9
кол-во високосных г. 9/4=2
кол-во обычных г. 9-2=7
кол-во дней високосных г. 2*366=732
кол-во дней обычных г. 7*365=2555
сумма дней 732+2555=3287
точное кол-во дней для расчета 3285-3287=-2 363

Для 3650 дней
кол-во годов 3650/365=10
кол-во високосных г. 10/4=2
кол-во обычных г. 10-2=8
кол-во дней високосных г. 2*366=732
кол-во дней обычных г. 8*365=2920
сумма дней 732+2920=3652
8/2=0 если 0 то 366, если нет 365 (для погрешности) ВРЕТ
для погрешности 366-2= и +1 год
точное кол-во дней для расчета 3650-3652=364
Получаем для года месяца и дней 04.05.2013

условие 1 и 3 значит 366
условие 2 и 6 значит 366
3:1=3
6:2=3
9:3=3

В начале не привязываемся к какой либо дате, только к текущему году (месяц день пока не трогаем выводим текущее за минусом года/лет)
Есть количество дней нужно посчитать количество лет месяцев и дней
кол-во дней делим на 365 получаем вол-во лет (но не совсем точно так как где то 366 дней)
ИЗ ТЕКУЩЕГО ГОДА ВЫЧИТАЕМ ПОЛУЧЕННОЕ КОЛ-ВО ЛЕТ (так как у нас не совсем точный расчет для високосного года, вычет так же может быть не совсем верный)
Проверяем и корректируем

От текущей даты мы отняли 4 года
Это мы рассмотрели Идеальный вариант

Если мы берем кол-во дней например 1095 (3 года)
По расчетам мы получим:
0 - високосных
3 - обычных, возможно в этих 3 был 1 високосный
мы отнимем от текущего года 3, а нужно 2 и 365 дней
аналогично для 1 года 2х лет

если количество дней меньше 365 получаем 0 лет, из текущего года ничего не вычитаем на данном этапе нас не интересует 0 лет

Если кол-во обычных лет Больше или равно 1 и кол-во обычных лет меньше или равно 3 делаем следующие проверки входит ли в эти года високосный год

Проверяем на високосный год %Деление по модулю является остаток от целочисленного деления
Пример:
2020:4 = 505
505*4 = 2020
2020-2020 = 0

2021:4 = 505.25
505*4 = 2020
2021-2020 = 1
и так по кругу и узнаем високосный год))
Для високосного года 0

Если 0=0
Если последний проверяемый год оказался високосным, проверяем то дата не больше 28.02
3=3
Например: у нас 3 обычных года по первым расчетам, для 1 и 2 если один из них високосный сразу прибавляем +1 день так как они уже прошли,
а если високосный будет последний 3 проверяем что дата больше 28.02, если меньше +1 день не прибавляем.
А если високосный 1 из 3х или 2 из 3х сразу прибавляем +1 день.
Если делать вычитание года после то будет так
:: Если проверяемые дни меньше 4 лет но от 1-3 года, может быть что в этом периоде есть високосный год тогда нужно вернуть +1 день при условии что дата больше 28.02
if %kolnormyear% LEQ 3 (
if %kolnormyear% GEQ 1 (for /L %%x in (1,1,%kolnormyear%) do set provg=%%x& call:onetwothree) else ( goto :checkingnegativevalue) ) else ( goto :checkingnegativevalue)
goto :checkingnegativevalue

:onetwothree
:: %Деление по модулю является остаток от целочисленного деления, високосный будет 0=0 значит возвращаем +1 день
set /a vg=(%y%-%provg%)%%4
echo %y%-%provg%
echo %vg% == 0 ?
if %vg% == 0 (
if %kolnormyear% == %provg% (
if %m%%d% GTR 0228 set /a d+=1
) else ( set /a d+=1)
) else ( goto :end)

Но так как мы вначале сразу вычитаем например текущий 2022-3=2019
2019 + 0, 2019 +1, 2019 +2, 2019 +3
-0=+3 (2022)
-1=+2 (2021)
-2=+1 (2020)
-3=+0 (2019)
То есть расчет у нас обратный с 0 по 2, а 3 это текущий год
Условия оставляем те же 1-3, так как текущий год нам не надо, но в расчетах 0 нужен по этому смещаем все на -1 в расчетах
Меняем следующее
set /a vg=(%y%+%provg%-1)%%4
echo %y%+%provg%-1
И
if 1 == %provg% (
if %m%%d% LSS 0301 set /a d+=1


Дальше после +1 дня проверяем что кол-во дней не стало больше чем их может быть
например 32 дня в месяце

Проверяем текущий год является високосным или нет если да в феврале 29 дней если нет 28
Далее мы знаем для всех месяцев кол-во дней
Смотрим значение для текущего месяца и Сравниваем его с нашим прибавленным то что оно не больше его.
Если значение дней в месяце получилось больше чем может быть то +1 месяц и 1 число месяца и
Если 12+1=13 это 1 месяц +1 год

Можно проще без привязки к дате
Взять "Теперь узнаем точное оставшихся для расчета дней" и прибавить к ним +1 день и в дальнейшем делать расчет от даты.
if %vg% == 0 (
if 1 == %provg% (
if %m%%d% LSS 0301 set /a %remainingdays%+=1
) else ( set /a %remainingdays%+=1)
)
И не корректировать дату


Для 4 года и больше
проверка отрицательного значения
"точное кол-во дней для расчета" получается отрицательным например -2 дня
В некоторых случаях получаем погрешность например: 3285-3287=-2 и -1 условие меньше 0 вернём обратно +1 год и от 365(6) -2 или -1
Если обычных 3 6 9, а високосных 1 2 3 9:3=3 при результате 3 количество дней для погрешности будет 366 для всех других 365 ,
но так как деления с остатком нет будем делить по модулю вместо 3 будет 0
так же не вышло
деление по модулю
7:2 = 3.5
3*2 = 6
7-6 = 1
Где 0 там четное, но оно и для обычных подходит так же местами 0 получаем


При отрицательных днях 365 или 366 -2 или -1 и +1год
Получаем правильный год за минусом и "точное кол-во дней для расчета"

Обыч 1/0; 2/0; 3/0; В! 4/1; 5/1; 6/1; В! 7/2; 8/2; 9/2; В! 10/3; 11/3; 12/3 В!
Виско 3/1; 6/2; 9/3; 12/4 (нечетное делим на нечетное и на оборот четное делими на четное? и получаем деление без остатка хотя нет 11/3=3,6)

7/2=3,5
6/2=3

7+2=9/2=4,5
6+2=8/2=4

7*2=14

6*2=12
9*3=27
12*4=48

умножить обратно и сравнить то же число или нет будет ясно с остатком или нет
7/2=3,5
3*2=6
7 == 6 ?

Тестирования от високосной года даты
29.02.2020 - 730 дней
730-60=670 от 29.02.2020 - 60
670-365=305 от 31.12.2019 - 365
365-305=60 от 31.12.2018 - 305
должно остаться 31+28=59 янв.фев. +1д март получаем 01.03.2018
306 дней с марта по декабрь
306-305=1 марта


КОГДА КОЛ-ВО ДНЕЙ ОСТАЕТСЯ МЕНЬШЕ 365 ДНЕЙ
ПОПЫТКА ЗАМЕНИТЬ БЛОК ВЫЧИТАНИЯ КАЖДОГО МЕСЯЦА ДРУГИМ

Код: Выделить всё

:cycle
:: Минус 1 месяц
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
:: Если значение было 0 расчеты сделаны выводим результат, если положительное делаем расчеты дальше
if %remainingdays% == 0 goto :result
:: Вычитаем месяц в днях
set /a remainingdays-=%d%
echo Предыдущее значение-%d%=%remainingdays% для %m%.%y%
:: Остановка Если значение отрицательное, делаем положительным днём и выводим результат
if %remainingdays% LSS 0 set d=%remainingdays:~1%& goto :result
:: Возвращаемся 
call :cycle
goto :end
КОЛ-ВО ДНЕЙ МЕНЬШЕ ГОДА НО ЭТО НЕ ЗАНЧИТ ЧТО РАСЧЕТЫ НЕ ЗАТРАГИВАЮТ ПРЕДЫДУЩИЙ ГОД 01.03.2022-359 дней перейдет в предыдущий год

Для обычного года сумма месяцев
1-31
2-59
3-90
4-120
5-151
6-181
7-212
8-243
9-273
10-304
11-334
12-365
Обратный порядок
12-31
11-61
10-92
9-122
8-153
7-184
6-214
5-245
4-275
3-306
2-334
1-365

В КОДЕ НИЖЕ Я НЕ УЧЁЛ РАЗВОРОТ ДАТ ИЛИ ОБРАТНЫЙ ОТСЧЕТ МЕСЯЦА И РАСЧЕТ БУДЕТ НЕ ВЕРНЫМ
Если у нас 1 январь 15 , а получили мы 6 месяцев при вычитании будет ошибка в 3-4 дня так как там нет февраля только 30 или 31
это будет 12-5=7

Код: Выделить всё

:: Так как везде расчет был больше 1 года, а тут остаток меньше года снова проверяем високосный год дата больше или равна +1 день
set /a feb=y%%4
if %feb%==0 (
if %m%%d% GEQ 0229 set vis=1) else ( set vis=0)
:: Оставшееся количество дней меньше 365 (1 года) разобьём по месяцам (меньше или равно)
if %remainingdays% LEQ 31 set mp=1& set /a dp=31-%remainingdays%& goto :dayb
if %remainingdays% LEQ 59 set mp=2& set /a dp=59+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 90 set mp=3& set /a dp=90+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 120 set mp=4& set /a dp=120+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 151 set mp=5& set /a dp=151+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 181 set mp=6& set /a dp=181+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 212 set mp=7& set /a dp=212+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 243 set mp=8& set /a dp=243+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 273 set mp=9& set /a dp=273+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 304 set mp=10& set /a dp=304+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 334 set mp=11& set /a dp=334+%vis%-%remainingdays%& goto :dayb
if %remainingdays% LEQ 365 set mp=12& set /a dp=365+%vis%-%remainingdays%& goto :dayb


:dayb
:: Проверяем кол-во месяцев нужно ли смещается на год
set /a m-=%mp%

:: Если 0 предыдущий год декабрь
if %m% == 0 set m=12& set/a y-=1
:: Если отрицательное вычитаем из 12 и -1 год
set d=0%dp%
set d=%dp:~-2%
if %m% LSS 0 (
set /a m=12%m%
set/a y-=1
set /a feb=y%%4
if %feb%==0 (
if %m%%dp% LSS 301 set /a dp+=1)

:: День если 0 то -1 месяц конец, а если больше (32) +1 месяц начало
if %dp% == 0 (
set /a m-=1
:: Если месяц 1-1=0 значит месяц 12 и -1 год
if %m%==0 set m=12
if %m%==12 set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else ( set feb=28)
:: Для месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set d=%%i
)

:: Теперь проверка если больше чем может быть в месяце
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текущего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numsravn=%%i
:: Проверить день например 32 число больше чем может быть, +1 месяц и 1 число месяца
if %dp% GTR %numsravn% set /a m+=1& set d=1
:: Если 12+1=13 это 1 месяц +1 год
if %m%==13 set m=1& set /a y+=1



:: Оставшееся количество дней меньше 365 (1 года) разобьём по месяцам (меньше или равно)
set mp=1
set /a feb=y%%4
if %feb%==0 (set feb=29) else ( set feb=28)
for /f "tokens=%mp%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set sld=%%i
:: Суммируем дни месяцев
set /a rs+=%sld%
:: Если остаток дней меньше или равен переходим дальше
if %remainingdays% LEQ %sld% set /a dp=%rs%-%remainingdays%& goto :
:: Прибавляем по 1 месяцу
set /a mp+=1
ДРУГОЙ ВАРИАНТ ЦИКЛАМИ накидан но не доделан

Код: Выделить всё

set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Запустим цикл от января до текущего месяца по 1 на каком месяце условие выполнится прекратим выполнение цикла
for /l %%k in (1,1,%m%) do (
for /f "tokens=%%k" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set sld=%%i& set m=%%k
:: Суммируем дни месяцев
set /a rs+=%sld%
:: Если остаток дней меньше или равен переходим дальше
if %remainingdays% LEQ %sld% set /a dp=%rs%-%remainingdays%& goto :
)

:: Если остаток больше значить запускаем цикл в обратном направлении -1год от 12 месяца к 1
set /a y-=1
set /a feb=y%%4
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
set m=12
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set sld=%%i
:: Суммируем дни месяцев
set /a rs+=%sld%
:: Если остаток дней меньше или равен переходим дальше
if %remainingdays% LEQ %sld% set /a dp=%rs%-%remainingdays%& goto :
:: Вычитаем 1 месяц
set /a m-=1
Снова приходим от чего пытались уйти от подсчета чисел каждого месяца, если уже посчитанные подставлять опять же проверка високосного года и +1 день после 29.02 для каждого месяца при вычитании.
количество слов: 1320
Партнёрская ссылка на Хостинг Beget https://beget.com/p937243
Ответить Вложения 12 Пред. темаСлед. тема

Вернуться в «Windows»