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

16

%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. Я бы предпочел не использовать сторонний инструмент, если это вообще возможно.

Пекка
источник

Ответы:

22

Было несколько попыток ( Роб ван дер Вуде что-то имел), но на самом деле ничего не получалось во всех регионах. Тем не менее, вы можете получить текущее время в легко разбираемом формате с помощью

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), но это ничто, что подсчет не может сделать :-)

детеныш
источник
1
Отлично, это выглядит именно так, как мне нужно! Спасибо.
Пекка
2
Для записи: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xэто немного лучше. Здесь также есть более компактная версия , а именно в этом комментарии .
Томалак
Немного сложно найти и обновить все старые экземпляры, где вы что-то написали :). Я бы, вероятно, уже использовал Win32_UTCTime и Win32_LocalTime.
Джои
действительно фантастика!
Jeromerg
Как говорит @Tomalak, findstrрешение намного лучше, так как в моем случае оригинал for(без skip) повторяется 3 раза. Один раз для слова "LocalDateTime", второй раз для фактической даты и третий раз для пустого значения (может быть, разрыв строки?).
Cavpollo
9

Вот две строки, которые я использовал, которые, кажется, работают независимо от версии 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

Я попытался сделать его однострочным с &&, но, похоже, это не сработало, поэтому я прибег к двухстрочной версии. Надеюсь это поможет.

Вокатские ворота
источник
0

Я использую этот трюк, чтобы получить 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.

Марк Дрейк
источник