Код: Выделить всё
@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
Как вычесть или прибавить 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
Проверка у полученного месяца есть такое число если проверка выпала на коней месяца, если нет подставляем максимальное число для получаемого месяца
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
Проверка у полученного месяца есть такое число если проверка выпала на коней месяца, если нет подставляем максимальное число для получаемого месяца
Код: Выделить всё
@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
Код: Выделить всё
@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
Код: Выделить всё
@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
Код: Выделить всё
@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
уже был скрипт минус 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
Код: Выделить всё
@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
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
ЕЩЁ НЕСКОЛЬКО ВАРИАНТОВ ДЛЯ КОЛ-ВА ДНЕЙ
Вначале рассчитаем большие значения на кол-во лет, после оставшееся значение дней (меньше 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
Код: Выделить всё
@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
Код: Выделить всё
@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