아래의 서브 루틴은 두 부분으로 구성됩니다. 먼저 첫 번째 매개 변수에 지정된 날짜를 확인하고 날짜가 나쁜 경우 ERRORLEVEL = 1을 반환합니다. 원하는 경우 연도 유효 범위를 삽입 할 수 있습니다 (그렇지 않으면 yyOK 부분을 제거).
그런 다음 두 번째 및 세 번째 매개 변수에서 기준 시간과 시간대를 조정하고 조정 날짜를 표시합니다.
:validateDate result= YYYY/MM/DD [HH HHAdjust]
setlocal EnableDelayedExpansion
set i=0
for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do (
set /A i+=1
set daysPerMonth[!i!]=%%a
)
set result=Invalid date
for /F "tokens=1-3 delims=/" %%a in ("%2") do set yy=%%a& set mm=%%b& set dd=%%c
set /A yy=%yy%, mm=10%mm% %% 100, dd=10%dd% %% 100, yyMOD4=yy%%4 >NUL 2>&1 || goto exit
if %yyMOD4% equ 0 set daysPerMonth[2]=29
set /A yyOK=0, mmOK=0, ddOK=0
rem Modify year limits as you wish (or remove they):
if %yy% geq 1900 if %yy% leq 2015 set yyOK=1
if %mm% geq 1 if %mm% leq 12 set mmOK=1
id %dd% geq 1 if %dd% leq !daysPerMonth[%mm%]! set ddOK=1
set /A dateOK=yyOK*mmOK*ddOK
if %dateOK% neq 1 goto exit
rem Date is correct
set result=%yy%/%mm%/%dd%
rem Adjust the hour to different time zone, if given
rem %3=base hour, %4=adjust with sign (+ or -)
if "%4" equ "" goto exit
set /A newHH=10%3 %% 100 %4
if %newHH% gtr 23 (
rem Pass to next day
set /A newHH-=24, dd+=1
if !dd! gtr !daysPerMonth[%mm%]! (
set /A dd=1, mm+=1
if !mm! gtr 12 (
set /A mm=1, yy+=1
)
)
)
if %newHH% lss 1 (
rem Pass to previous day
set /A newHH+=24, dd-=1
if !dd! lss 1 (
set /A mm-=1
if !mm! lss 1 (
set /A mm=12, yy-=1
)
for %%m in (!mm!) do (
set /A dd=daysPerMonth[%%m]
)
)
)
set result=%yy%/%mm%/%dd% %newHH%
:exit
endlocal & set %1=%result%
exit /B
이 프로그램을 테스트하고 문제를보고하십시오.
편집 : 나는 새로운 OP의 요구 사항에 맞게 기존 프로그램을 수정했습니다.
서브 루틴은 더 이상 결과와 함께 ERRORLEVEL 값을 반환하지 않습니다. 결과를받을 변수를 나타내는 새로운 첫 번째 매개 변수로 호출해야합니다. 원래 날짜가 잘못되면 "잘못된 날짜"가됩니다. 기준과 조정 시간이 주어지면, 반환 된 값은 조정 된 날짜와 시간을 포함합니다. 예를 들어 :
call validate.bat adjusted= 2012/3/5 3 -2
if "%adjusted%" neq "Invalid date" (
echo Adjusted date and hour are: %adjusted%
)
안토니오
는
이 무엇 달력을 것입니까? –
무엇을 의미합니까? – Leo92
배치를 사용하여 달력의 날짜를 확인하여 존재 여부, 어떤 달력을 확인하고 있습니까? 우리가하는 일을 알지 못한다면 그렇게 할 수있는 코드를 줄 수는 없습니다. –