O local não sabe% DATE% e% TIME% em arquivos em lotes?

16

As variáveis ​​de ambiente %DATE%e %TIME%fornecem a data e hora atuais nas máquinas Windows na linha de comando e dentro de um arquivo em lotes.

Infelizmente, esses valores são compatíveis com a localidade! Significando que, digamos, em uma máquina alemã, você obterá

26.1.2011

ao invés de

2011-26-01

isso estraga a classificação se você deseja usar essa variável em um nome de arquivo.

Existe alguma maneira fácil de se apossar de uma YYYY-MM-DDsequência de datas que não reconhece o código de idioma em um arquivo em lotes do Windows?

No momento, estou trabalhando com essa solução alternativa:

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%

mas agora isso é específico da localidade alemã - obviamente, uma solução completamente independente seria muito melhor.

O sistema operacional em questão é o Server 2008. Eu preferiria não usar uma ferramenta de terceiros, se possível.

Pekka
fonte

Respostas:

22

Houve algumas tentativas ( Rob van der Woude teve alguma coisa), mas nada realmente funcionou em todos os locais. No entanto, você pode obter a hora atual em um formato facilmente analisável via

wmic os get LocalDateTime

A seguir, você já tem pelo menos o 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%

No entanto, você provavelmente precisará considerar o deslocamento do fuso horário (a menos que seja para um arquivo de log, eu sempre usaria o UTC), mas isso não é nada que um pouco de cálculo não pode fazer :-)

Joey
fonte
1
Excelente, isso parece exatamente o que eu preciso! Obrigado.
Pekka
2
Para que conste: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xé um pouco melhor. Há também uma versão mais compacta disponível aqui , nomeadamente nesse comentário .
precisa saber é o seguinte
É um pouco difícil encontrar e atualizar todas as instâncias antigas em que você escreveu algo :). Eu provavelmente usaria Win32_UTCTime e Win32_LocalTime agora.
Joey
realmente fantástico!
22418 jeromerg
Como @Tomalak diz, a findstrsolução é muito melhor, como no meu caso, o original for(sem o skip) itera 3 vezes. Uma vez para a palavra "LocalDateTime", uma segunda vez para a data real e uma terceira vez para um valor vazio (talvez uma quebra de linha?).
cavpollo
9

Aqui está uma linha dupla que eu estou usando, que parece funcionar independentemente da versão do Windows ou das configurações de horário local:

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%

Isso definirá uma variável chamada% CUR_DATE% no seguinte formato padrão ISO:

yyyy-mm-dd

Tentei torná-lo uma linha com o &&, mas não parecia necessário, então recorri à versão em duas linhas. Espero que isto ajude.

Vocatus Gate
fonte
0

Eu uso esse truque para obter o 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%

No entanto, ele tem o efeito colateral de alterar brevemente todo o sistema para UTC. Provavelmente, isso é bom em uma estação de trabalho pessoal, mas não tenho certeza de qual seria o impacto em um grande servidor de produção, que provavelmente deveria estar definido como UTC de qualquer maneira.

mark d drake
fonte