Как уже отмечали другие, форматы даты и времени %DATE%
и %TIME%
(а также date /T
и time /T
) зависят от локали, поэтому извлечение текущей даты и времени всегдакошмар, и невозможно получить решение, которое работает со всеми возможными форматами, поскольку нет практически никаких ограничений формата.
Но есть другая проблема с кодом, подобным следующему (допустим, чтоформат даты, например MM/DD/YYYY
и 12-часовой формат времени, например h:mm:ss ap
, где ap
имеет значение AM
или PM
):
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%
Конечно, возникновение описанной проблемы весьма маловероятно, но в какой-то момент это произойдет и приведет к странным необъяснимым сбоям.
Описанная проблема не может возникнуть при подходахна основе команды wmic
, как описано в ответе пользователем Stephan и в ответе пользователем PA. , поэтому яНастоятельно рекомендую пойти на один из них.Единственный недостаток wmic
в том, что он намного медленнее.