正如其他人已经指出的那样,%DATE% 和 %TIME%(以及 date /T 和 time /T)的日期和时间格式取决于区域设置,因此提取当前日期和时间始终是噩梦,因为几乎没有任何格式限制,所以不可能找到适用于所有可能格式的解决方案。
但是像下面这样的代码还有另一个问题(让我们假设像 MM/DD/YYYY 这样的日期格式和像 h:mm:ss.ff ap 这样的 12 小时时间格式,其中 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% 表达式可能返回与以下值不同的值(您可以证明在回显包含大量此类(最好是%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%
当然,所描述的问题发生的可能性很小,但在某一时刻它会发生并导致奇怪的无法解释的故障。
使用基于answer 用户Stephan 和answer 用户PA. 中描述的wmic 命令的方法不会出现所述问题,因此我强烈建议选择一个其中。 wmic 的唯一缺点是速度较慢。