Локально-невідомий% 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%

але це зараз специфічно для німецької мови - очевидно, абсолютно незалежне рішення було б набагато приємніше.

ОС, про яку йдеться, - це сервер 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
Чудово, це виглядає саме як те, що мені потрібно! Дякую.
Pekka

2
Для запису: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xце трохи крихітніше. Тут також доступна більш компактна версія , а саме в цьому коментарі .
Томалак

Трохи важко знайти та оновити всі старі випадки, коли ви щось написали :). Напевно, я б зараз використовував Win32_UTCTime та Win32_LocalTime.
Joey

дійсно фантастично!
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 у будь-якому випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.