正如其他人已经指出的那样,
%DATE%
和
%TIME%
(以及
date /T
和
time /T
)的日期和时间格式依赖于语言环境,因此提取当前日期和时间总是一场噩梦,并且几乎没有格式限制,因此不可能找到适用于所有可能格式的解决方案。请注意保留HTML标签。
但是像以下代码一样还存在另一个问题(假设日期格式为MM/DD/YYYY
,12小时时间格式为h:mm:ss.ff ap
,其中ap
为AM
或PM
,ff
为小数秒):
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"
set "HOUR=0%HOUR%"
echo %DATE:~-4,4%%DATE:~0,2%%DATE:~3,2%_%HOUR:~-2%%TIME:~3,2%%TIME:~6,2%
每个
%DATE%
和
%TIME%
的实例返回其扩展时存在的日期或时间值,因此第一个
%DATE%
或
%TIME%
表达式可能与后续表达式返回不同的值(当您回显包含大量此类表达式的长字符串时,最好使用
%TIME%
来验证)。
您可以像这样改进上述代码以仅保留单个
%DATE%
和
%TIME%
实例:
set "CURRDATE=%DATE%" & set "CURRTIME=%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"
set "HOUR=0%HOUR%"
echo %CURRDATE:~-4,4%%CURRDATE:~0,2%%CURRDATE:~3,2%_%HOUR:~-2%%CURRTIME:~3,2%%CURRTIME:~6,2%
但是,当在午夜执行时,
%DATE%
和
%TIME%
返回的值可能反映不同的日期。
要使
%CURRDATE%
和
%CURRTIME%
具有相同的日期,唯一的方法是:
set "CURRDATE=%DATE%" & set "CURRTIME=%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"
if not "%CURRDATE%" == "%DATE%" if %CURRTIME:~0,2% equ 0 set "CURRDATE=%DATE%"
set "HOUR=0%HOUR%"
echo %CURRDATE:~-4,4%%CURRDATE:~0,2%%CURRDATE:~3,2%_%HOUR:~-2%%CURRTIME:~3,2%%CURRTIME:~6,2%
当然,所描述的问题发生的可能性非常小,但在某个时刻它会发生并导致奇怪的无法解释的故障。
所述问题不会出现在基于
wmic
命令的方法中,如
Stephan用户的
答案和
PA.用户的
答案中所述,因此我强烈建议选择其中之一。
wmic
的唯一缺点是速度较慢。