如何使用日历查看日期,我想要做的是用户以这种方式插入日期2012/07/15,我想检查日期是否存在于日历中。 例如,如果他插入2012/14/13甚至2012/02/31,我试图手动完成,但它真的很难,所以我的问题是:
是否有原生功能(甚至是3D派对工具)来检查日历中的日期?
如果用户插入日期和小时,我想在不同的时区地点给出相同的结果?
答案 0 :(得分: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位数日期。如果您想支持1位数月或数天,请将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
我不明白你想用日期和时区做什么。
答案 1 :(得分:1)
下面的子程序由两部分组成。首先检查第一个参数中给出的日期,如果日期不好,则返回ERRORLEVEL = 1。如果您愿意,可以插入年份有效范围(否则,删除yyOK部分)。
然后在第2和第3个参数中调整基准时间和时区,并显示调整后的日期。
: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%
)
安东尼奥