Locale-inconsapevole% DATE% e% TIME% nei file batch?


16

Le variabili di ambiente %DATE%e %TIME%forniscono la data e l'ora correnti sui computer Windows nella riga di comando e all'interno di un file batch.

Purtroppo, questi valori sono a livello locale! Significa che, diciamo, su una macchina tedesca, otterrai

26.1.2011

invece di

2011-26-01

questo rovina l'ordinamento se si desidera utilizzare questa variabile in un nome file.

Esiste un modo semplice per ottenere una YYYY-MM-DDstringa di data non consapevole delle impostazioni locali in un file batch di Windows?

Per il momento, sto lavorando con questa soluzione piuttosto complicata:

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

ma questo è ora specifico della localizzazione tedesca - ovviamente, una soluzione completamente indipendente sarebbe molto più bella.

Il sistema operativo in questione è Server 2008. Preferirei di gran lunga non utilizzare uno strumento di terze parti, se possibile.

Risposte:


22

Ci sono stati alcuni tentativi ( Rob van der Woude aveva qualcosa), ma nulla ha funzionato davvero in tutti i locali. Tuttavia, è possibile ottenere l'ora corrente in un formato facilmente analizzabile tramite

wmic os get LocalDateTime

Quanto segue ottiene almeno UTC già:

@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%

Tuttavia, probabilmente dovrai tenere conto dell'offset del fuso orario (a meno che non sia per un file di registro, quindi utilizzerei sempre UTC) ma non è niente che un po 'di calcolo non possa fare :-)


1
Eccellente, sembra esattamente quello di cui ho bisogno! Grazie.
Pekka,

2
Per la cronaca: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xè un po 'più bello. C'è anche una versione più compatta disponibile qui , vale a dire in quel commento .
Tomalak,

È un po 'difficile trovare e aggiornare tutte le vecchie istanze in cui hai scritto qualcosa :). Probabilmente userei Win32_UTCTime e Win32_LocalTime ormai.
Joey,

davvero fantastico!
Jeromerg,

Come dice @Tomalak, la findstrsoluzione è molto migliore, come nel mio caso, l'originale for(senza il skip) viene ripetuto 3 volte. Una volta per la parola "LocalDateTime", una seconda volta per la data effettiva e una terza volta per un valore vuoto (forse un'interruzione di riga?).
cavpollo,

9

Ecco una linea doppia che sto usando, che sembra funzionare indipendentemente dalla versione di Windows o dalle impostazioni dell'ora locale:

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%

Ciò imposterà una variabile chiamata% CUR_DATE% nel seguente formato standard ISO:

yyyy-mm-dd

Ho provato a renderlo una linea con &&, ma non mi sembrava che ci volesse, quindi ho fatto ricorso alla versione a due righe. Spero che sia di aiuto.


0

Uso questo trucco per ottenere 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%

Tuttavia ha l'effetto collaterale di cambiare brevemente l'intero sistema in UTC. Questo è probabilmente OK su una workstation personale, ma non è sicuro di quale impatto sarebbe un server di produzione di grandi dimensioni, che dovrebbe comunque essere impostato su UTC.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.