1

我如何使用日历检查日期,我想要做的是用户以这种方式插入日期 2012/07/15,并且我想检查该日期是否存在于日历中。例如,如果他插入 2012/14/13 甚至 2012/02/31 ,我尝试手动执行此操作,但它真的很难,所以我的问题是:

  1. 是否有本机功能(甚至 3d 派对工具)来检查日历中的日期?

  2. 如果用户插入日期和时间,我想在不同的时区位置给出相同的结果?

4

2 回答 2

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

我不明白你想对日期和时区做什么。

于 2012-06-26T15:32:20.360 回答
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%
)

安东尼奥

于 2012-06-26T19:19:36.160 回答