Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата:
как присвоит переменной значение дати на n дней (месяцев) больше (меньше) текущей?
Самый простой способ (и самый медленный) - итеративный цикл по количеству дней... Как и предупреждал, несколькими строчками кода не обошлось. Для ускорения расчетов можно было применить цикл по месяцам с выравниванием даты на последнем шаге, но тогда код стал бы еще более громоздким и плохо читаемым.
Код: Выделить весь код
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
Rem Параметры расчета: кол-во дней (>0!) и направление (+/-)
SET DAYS=730
SET SIGN=+
Rem Установка окружения и цикл расчета
CALL :GetDate
CALL :GetMnthDays
:Start
CALL :NextDay "%SIGN%1"
SET /A DAYS=%DAYS%-1
IF %DAYS% NEQ 0 GOTO :Start
Rem Вывод результата и завершение работы
CALL :ShowDate
EXIT
Rem Перемещение на следующий/предыдущий календарный день
:NextDay
SET /A Day=%Day%%~1
IF %Day% GTR !DOFW! (
	CALL :NextMonth +1
	CALL :GetMnthDays
	SET /A Day=1
)
IF %Day% EQU 0 (
	CALL :NextMonth -1
	CALL :GetMnthDays
	SET /A Day=!DOFW!
)
GOTO :EOF
Rem Расчет года и месяца, отстоящих от заданного
:NextMonth
SET /A MNDF=%Year%*12+%Month%%1
SET /A Year=(%MNDF%-1)/12
SET /A Month=%MNDF%-%Year%*12
GOTO :EOF
Rem Число дней в заданном месяце
:GetMnthDays
IF %Month% EQU 2 (
	CALL :IsYearVisok
	SET /A DOFW = 28+!VISOK!
) ELSE (
	SET NUM=0
	FOR %%i IN (31 28 31 30 31 30 31 31 30 31 30 31) DO (
		SET /A NUM=!NUM!+1
		IF %Month% EQU !NUM! (
			SET DOFW=%%i
			GOTO :EOF
		)
	)
)
GOTO :EOF
Rem Проверка года на високосность
:IsYearVisok
SET /A M1=%Year%-(%Year%/4)*4
SET /A M2=%Year%-(%Year%/100)*100
SET /A M3=%Year%-(%Year%/400)*400

SET VISOK=0
IF 0 EQU %M1% IF 0 NEQ %M2% SET VISOK=1
IF 0 EQU %M3% SET VISOK=1
GOTO :EOF
Rem Чтение текущей даты в переменные окружения
:GetDate
FOR /F "tokens=1,3" %%i IN ('REG QUERY "HKCU\Control Panel\International" /s^|findstr /C:"iDate" /C:"sDate"') DO SET %%i=%%j
FOR /F "TOKENS=1-4* DELIMS=%sDate% " %%A IN ('DATE/T') DO (
	IF %iDate%==0 (
		SET Year=%%C
		SET Month=%%A
		SET Day=%%B
	)
	IF %iDate%==1 (
		SET Year=%%C
		SET Month=%%B
		SET Day=%%A
	)
	IF %iDate%==2 (
		SET Year=%%A
		SET Month=%%B
		SET Day=%%C
	)
)
GOTO :EOF
Rem Отображение итоговой даты
:ShowDate
SET Month=0%Month%
SET Month=%Month:~-2%
SET Day=0%Day%
SET Day=%Day:~-2%
IF %iDate%==0 ECHO %Month%%sDate%%Day%%sDate%%Year%
IF %iDate%==1 ECHO %Day%%sDate%%Month%%sDate%%Year%
IF %iDate%==2 ECHO %Year%%sDate%%Month%%sDate%%Day%
GOTO :EOF

Последний раз редактировалось amel27, 20-10-2006 в 10:33. Причина: кометические мелочи

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:51, 20-10-2006 | #18