Locale-inconsciente% DATE% e% TIME% em arquivos em lote?

11

As variáveis de ambiente %DATE% e %TIME% fornecem a data e a 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! Significa que, digamos, em uma máquina alemã, você terá

26.1.2011

em vez de

2011-26-01

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

Existe alguma maneira fácil de obter uma string YYYY-MM-DD date sem reconhecimento de local em um arquivo em lotes do Windows?

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

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

mas isso agora é específico do idioma alemão - obviamente, uma solução completamente independente seria muito mais agradável.

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

    
por Pekka 웃 26.01.2011 / 21:39

2 respostas

17

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

wmic os get LocalDateTime

O texto a seguir apresenta pelo menos 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 precisa considerar o deslocamento de fuso horário (a menos que seja para um arquivo de log, então eu sempre usaria o UTC), mas isso não é nada que um cálculo possa fazer: -)

    
por 26.01.2011 / 22:53
8

Aqui está um two-liner que eu tenho usado, o que parece funcionar independentemente da versão do Windows ou das configurações de hora 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

Eu tentei criar uma linha única com & & amp ;, mas não pareceu demorar, então recorri à versão de duas linhas. Espero que isso ajude.

    
por 23.07.2014 / 21:19