正如其他人已经指出的那样,%DATE%and %TIME%(以及date /Tand time /T)的日期和时间格式取决于语言环境,因此提取当前日期和时间始终是一场噩梦,并且不可能获得一种适用于所有可能情况的解决方案。格式,因为几乎没有格式限制。
但存在与像以下之一的代码的另一个问题(让我们假定日期格式像MM/DD/YYYY和像一个12小时时间格式h:mm:ss.ff ap,其中ap或者是AM或PM和ff是秒的小数部分):
rem // Resolve AM/PM time:
set "HOUR=%TIME:~,2%"
if "%TIME:~-2%" == "PM" if %HOUR% lss 12 set /A "HOUR+=12"
if "%TIME:~-2%" == "AM" if %HOUR% equ 12 set /A "HOUR-=12"
rem // Left-zero-pad hour:
set "HOUR=0%HOUR%"
rem // Build and display date/time string:
echo %DATE:~-4,4%%DATE:~0,2%%DATE:~3,2%_%HOUR:~-2%%TIME:~3,2%%TIME:~6,2%
的每个实例%DATE%和%TIME%在其膨胀时将返回日期或时间值存在,因此第一%DATE%或%TIME%表达可能返回比下述的不同的值(可以证明呼应含有巨大的这种量,preferrably一个长字符串时%TIME%,表达式)。
你可以改善上述代码保持的单个实例%DATE%和%TIME%这样的:
rem // Store current date and time once in the same line:
set "CURRDATE=%DATE%" & set "CURRTIME=%TIME%"
rem // Resolve AM/PM time:
set "HOUR=%CURRTIME:~,2%"
if "%CURRTIME:~-2%" == "PM" if %HOUR% lss 12 set /A "HOUR+=12"
if "%CURRTIME:~-2%" == "AM" if %HOUR% equ 12 set /A "HOUR-=12"
rem // Left-zero-pad hour:
set "HOUR=0%HOUR%"
rem // Build and display date/time string:
echo %CURRDATE:~-4,4%%CURRDATE:~0,2%%CURRDATE:~3,2%_%HOUR:~-2%%CURRTIME:~3,2%%CURRTIME:~6,2%
但仍然,当在午夜执行时,%DATE%和中的返回值%TIME%可能反映不同的日期。
有当天的唯一途径%CURRDATE%和%CURRTIME%是这样的:
rem // Store current date and time once in the same line:
set "CURRDATE=%DATE%" & set "CURRTIME=%TIME%"
rem // Resolve AM/PM time:
set "HOUR=%CURRTIME:~,2%"
if "%CURRTIME:~-2%" == "PM" if %HOUR% lss 12 set /A "HOUR+=12"
if "%CURRTIME:~-2%" == "AM" if %HOUR% equ 12 set /A "HOUR-=12"
rem // Fix date/time midnight discrepancy:
if not "%CURRDATE%" == "%DATE%" if %CURRTIME:~0,2% equ 0 set "CURRDATE=%DATE%"
rem // Left-zero-pad hour:
set "HOUR=0%HOUR%"
rem // Build and display date/time string:
echo %CURRDATE:~-4,4%%CURRDATE:~0,2%%CURRDATE:~3,2%_%HOUR:~-2%%CURRTIME:~3,2%%CURRTIME:~6,2%
当然,所描述的问题的发生是极不可能的,但是在某一时刻它将发生并引起奇怪的无法解释的故障。
不能与方法的基础上发生所描述的问题wmic中所描述的命令答复由用户斯蒂芬和在回答由用户PA。,因此我强烈建议您选择其中之一。的唯一缺点wmic是它的运行速度较慢。