正如其他人已经指出的那样,%DATE%
and %TIME%
(以及date /T
and 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
是它的运行速度较慢。