我认为在这种情况下你最好使用 PowerShell 或 WSH(正如 Rihan Meij 提到的)。比较数据和时间是可能的,但非常脆弱(因为无法批量获取文化中立的数据/时间)。你可能会写这样的东西:
setlocal enableextensions
set Now=%date%
set NowTime=%time:~0,-3%
call :tokenize_date %Now%
call :tokenize_time %NowTime%
echo %YEAR%-%MONTH%-%DAY%T%HOUR%:%MINUTE%:%SECOND%
call :one_hour_before %Now% %NowTime%
echo %RESULT_DATE% %RESULT_TIME%
ping -n 1 -w 1500 ::1>NUL
set Now2=%date%
set NowTime2=%time:~0,-3%
call :date_time_compare %Now% %NowTime% %Now2% %NowTime2%
echo %Now%T%NowTime% compared to %Now2%T%NowTime2%: %RESULT%
endlocal
goto :eof
:tokenize_date
rem assuming ISO 8601 date format YYYY-MM-DD
setlocal enableextensions
set arg=%1
set YEAR=%arg:~0,4%
set MONTH=%arg:~5,2%
set DAY=%arg:~8,2%
endlocal&set YEAR=%YEAR%&set MONTH=%MONTH%&set DAY=%DAY%
goto :eof
:tokenize_time
rem assuming ISO-8601 time format HH:MM:SS, 24-hour
setlocal enableextensions
set arg=%1
set HOUR=%arg:~0,2%
set MINUTE=%arg:~3,2%
set SECOND=%arg:~6,2%
endlocal&set HOUR=%HOUR%&set MINUTE=%MINUTE%&set SECOND=%SECOND%
goto :eof
:one_hour_before
rem gets a date as %1 and a time as %2
rem returns a date in RESULT_DATE and a time in RESULT_TIME
setlocal enabledelayedexpansion enableextensions
set months=31 28 31 30 31 30 31 31 30 31 30 31
set i=0
for %%x in (%months%) do (
set /a i+=1
set month_length_!i!=%%x
)
call :tokenize_date %1
call :tokenize_time %2
set /a HOUR-=1
if %HOUR% LSS 0 (
set /a DAY-=1
set /a HOUR+=24
if %DAY% LSS 0 (
set /a MONTH-=1
if %MONTH% LSS 0 (
set /a YEAR-=1
set /a MONTH+=12
)
set /a DAY+=month_length_!MONTH!
)
)
endlocal&set RESULT_DATE=%YEAR%-%MONTH%-%DAY%&set RESULT_TIME=%HOUR%:%MINUTE%:%SECOND%
goto :eof
:date_time_compare
rem expects %1 - date 1, %2 - time 1, %3 - date 2, %4 - time 2
rem returns a value < 0 if datetime1 is earlier than datetime2
rem > 0 later than
rem = 0 equal to
rem the return value is saved in the variable %RETURN%
setlocal enableextensions
call :tokenize_date %3
call :tokenize_time %4
set YEAR2=%YEAR%
set MONTH2=%MONTH%
set DAY2=%DAY%
set HOUR2=%HOUR%
set MINUTE2=%MINUTE%
set SECOND2=%SECOND%
call :tokenize_date %1
call :tokenize_time %2
if %YEAR2% GTR %YEAR% (endlocal&set RESULT=-1&goto :eof) else (
if %YEAR2% LSS %YEAR% (endlocal&set RESULT=1&goto :eof) else (
if %MONTH2%%DAY2%%HOUR2%%MINUTE2%%SECOND2% GTR %MONTH%%DAY%%HOUR%%MINUTE%%SECOND% (
endlocal&set RESULT=-1&goto :eof
) else (
if %MONTH2%%DAY2%%HOUR2%%MINUTE2%%SECOND2%==%MONTH%%DAY%%HOUR%%MINUTE%%SECOND% (
endlocal&set RESULT=0&goto :eof
) else (
endlocal&set RESULT=1&goto :eof
)
)
)
)
goto :eof
抱歉,时间有点长了。比较日期/时间目前仅经过部分测试,但应该可行。当它包含亚秒时要小心,因为它们在这里引入了一个逗号,这会扰乱被调用子例程的参数顺序(因此%time:~0,-3%
以避免这种情况)。
之后您可以使用%~tI
扩展以获取日期和时间,将它们与当前减去一小时进行比较,并删除(如果适用)。
注 1:我假设 ISO 8601 日期和时间格式为 24 小时,这就是我在这里使用的格式。对于非标准日期格式,您必须稍微更改子例程(但 12 小时时间可能会很痛苦)。
注 2:目前,代码不关心闰年。还需要 5 或 6 行代码:one_hour_before
, 我认为。