В %DATE%
и %TIME%
переменные среды предоставляют текущую дату и время на компьютерах Windows в командной строке и в пакетном файле.
К сожалению, эти значения зависят от локали! Это означает, что, скажем, на немецкой машине вы получите
26.1.2011
вместо того
2011-26-01
это мешает сортировке, если вы хотите использовать эту переменную в имени файла.
Есть ли простой способ заполучить незнакомого человека YYYY-MM-DD
строка даты в командном файле Windows?
На данный момент я работаю с этим довольно неуклюжим обходным решением:
for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%
но теперь это зависит от немецкого языка - очевидно, что полностью независимым решением будет много приятнее.
Речь идет о Server 2008. Я бы предпочел не использовать сторонние инструменты, если это вообще возможно.
Было несколько попыток (Роб ван дер Вуде было что-то), но ничего не работало во всех регионах. Однако вы можете получить текущее время в удобном для анализа формате с помощью
wmic os get LocalDateTime
Следующее дает вам уже как минимум UTC:
@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%
rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%
echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%
Тем не менее, вам, вероятно, нужно учитывать смещение часового пояса (если это не для файла журнала, тогда я всегда буду использовать UTC), но этого не может сделать небольшой расчет :-)
Я использовал двухстрочный лайнер, который, кажется, работает независимо от версии Windows или настроек местного времени:
FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%
Это установит переменную с именем% CUR_DATE% в следующем стандартном формате ISO:
yyyy-mm-dd
Я попытался сделать его однострочным с помощью &&, но это не помогло, поэтому я прибег к двухстрочной версии. Надеюсь это поможет.
Я использую этот трюк, чтобы получить UTC ..
for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%
Однако у этого есть побочный эффект, заключающийся в кратком изменении всей системы на UTC. Это, вероятно, нормально для персональной рабочей станции, но не уверен, какое влияние окажет большой производственный сервер, который, вероятно, в любом случае должен быть установлен на UTC.