2012-06-26 4 views
1

캘린더를 사용하여 날짜를 확인할 수있는 방법은 사용자가이 방법으로 날짜를 삽입하는 것입니다. 2012/07/15에이 날짜가 있는지 확인하고 싶습니다. 캘린더. 그가 2012/14/13 또는 2012년 2월 31일를 삽입 할 경우 예를 들어, 내가 수동으로 그렇게하려고 노력하지만 정말 열심히, 그래서 내 qustions은 다음과 같습니다배치 파일 : 캘린더 확인

  1. 기본 기능이있는 (또는 3D 파티 도구) 캘린더에서 날짜를 확인하려면?

  2. 사용자가 날짜와 시간을 삽입하면 다른 시간대와 동일한 결과가 나타 납니까?

+0

이 무엇 달력을 것입니까? –

+0

무엇을 의미합니까? – Leo92

+0

배치를 사용하여 달력의 날짜를 확인하여 존재 여부, 어떤 달력을 확인하고 있습니까? 우리가하는 일을 알지 못한다면 그렇게 할 수있는 코드를 줄 수는 없습니다. –

답변

1

아래의 서브 루틴은 두 부분으로 구성됩니다. 먼저 첫 번째 매개 변수에 지정된 날짜를 확인하고 날짜가 나쁜 경우 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% 
) 

안토니오

+0

실례합니다. 스크립팅에 익숙하지 않지만이 스크립트를 어떻게 사용할 수 있습니까? validateDate YYYY/MM/DD HH HHAdjust 2012/05/04 그것은 작동하지 않았다. – Leo92

+0

첫번째 줄': validateDate YYYY/MM/DD [HH HHAdjust]'는 호출의 _ 형식을 보여준다; 예 :'call : validateDate 2012/05/04'. 시간대를 조정하려면 기본 시간과 조정을 포함 시키십시오.'call : validateDate 2012/05/04 % hour % + 6'. 나는 당신이 현재 시간에서 시간을 얻을 것이라고 생각한다 :'set hour = % time : ~ 0.2 %'** 편집 ** : 나는 단지 기본 시간에 왼쪽 0이있을 때 문제를 해결했다. 제발, 프로그램을 다시 복사하십시오! – Aacini

+0

실례 합니다만? _date_는 요청한 기본 시간과 조정 시간을 기준으로 조정됩니다. 배치 파일에 조정 된 _time_을 표시 하시겠습니까? 왜 그렇게하지 않았습니까? 당신은 이것을 썼습니다. "시간 = 13은 -2 시간을 빼야합니다. 그래서 13 시가 아닌 11시를 써야합니다. 지금은 큰 문제가 아닙니다." 그래서? 각 결과가 끝난 후 사양을 변경하면 사양이 충족됩니까? – Aacini

2

문자열의 유효성을 검사하는 간단한 기본 배치 명령이 없습니다.

날짜 문자열의 유효성을 검사하는 데 사용할 수있는 배치 서브 루틴은 다음과 같습니다.

@echo off 
setlocal 
set "dt=" 
set /p "dt=Enter a date in yyyy/mm/dd format: " 
if not defined dt exit /b 
call :validateDate dt && (echo date is valid) || (echo ERROR: date is invalid) 
exit /b 

:validateDate 
setlocal enableDelayedExpansion 
echo !%~1!|findstr /rx "[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]" >nul || exit /b 1 
for /f "tokens=1,2,3 delims=/" %%A in ("!%~1!") do (
    set /a "yyyy=10000%%A%%10000, mm=100%%B%%100, dd=100%%C%%100" || exit /b 1 
) 
if %mm% lss 1 exit /b 1 
if %mm% gtr 12 exit /b 1 
if %dd% lss 1 exit /b 1 
set "months=;1-31;2-28;3-31;4-30;5-31;6-30;7-31;8-31;9-30;10-31;11-30;12-31;" 
for /f "delims=;" %%A in ("!months:*;%mm%-=!") do set maxDays=%%A 
set /a "divBy4=yyyy%%4, divBy100=yyyy%%100, divBy400=yyyy%%400" 
if %mm% equ 2 if %divBy4% equ 0 (
    if %divBy100% neq 0 set /a maxDays+=1 
    if %divBy400% equ 0 set /a maxDays+=1 
) 
if %dd% gtr %maxDays% exit /b 1 
exit /b 0 

질문에 게시 한 날짜는 4 자리 연도, 2 자리 월 및 2 자리 날짜 만 허용됩니다. 당신이 한 자리 달 또는 일을 지원하려면, 다음에 FINDSTR을 변경 : 나는 당신이 날짜와 시간대에 수행 할 작업을 이해하지

echo !%~1!|findstr /rx /c:"[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]"^
         /c:"[0-9][0-9][0-9][0-9]/[0-9]/[0-9][0-9]"^
         /c:"[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9]"^
         /c:"[0-9][0-9][0-9][0-9]/[0-9]/[0-9]">nul || exit /b 1 

.

+0

ok 거기에 파일이있는 서버가 있습니다. 날짜와 시간을 삽입하면 원하는 파일이 제공되고 문제는 시간대와 다릅니다. 예를 들어 파일을 다운로드하려는 경우 2012/05/14, hour = 13 나는 -2 시간을 빼야합니다. 그래서 13 시가 아닌 11시를 써야합니다. 이제는 큰 일이 아닙니다.thign는 내가 시간 = 01에서 -2를 뺀다면 나는 하루를 되돌아 가야한다. 그리고 그 날이 1 이었다면 나는 한달 뒤로 되돌아 가야한다. 그리고 여기에 아마도 31,30,29 일을 달에 달려있을 것이다. 내가 원한을 원하지 않는 방식으로 모든 도구는 괜찮을 것입니다. – Leo92

+0

@dbenham : 100 년 동안의 조정이 잘못되었습니다. 수백 년으로 나눌 수없는 경우 수백 년으로 도약 할 수 있으므로 1700 년, 1800 년 및 1900 년은 윤년을 내지 만 ... – Aacini

+0

@Aacini - 당신은 틀렸다고 말했지만 내 코드가 틀렸다는 것이 맞습니다. . 2000 년은 400으로 나눌 수 있기 때문에 윤년입니다. 170018001900은 윤년이 아닙니다. 감사. 코드가 수정되었습니다. – dbenham