Назад | Перейти на главную страницу

% DATE% и% TIME% в пакетных файлах не знают локали?

В %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.