% DATE% et% TIME% ignorant les paramètres régionaux dans les fichiers de commandes?

16

Les variables d'environnement %DATE%et %TIME%fournissent la date et l'heure actuelles sur les machines Windows sur la ligne de commande et dans un fichier de commandes.

Malheureusement, ces valeurs sont sensibles aux paramètres régionaux! Cela signifie que, par exemple, sur une machine allemande, vous obtiendrez

26.1.2011

au lieu de

2011-26-01

cela bouscule le tri si vous souhaitez utiliser cette variable dans un nom de fichier.

Existe-t-il un moyen simple de récupérer une YYYY-MM-DDchaîne de date non locale dans un fichier de commandes Windows?

Pour le moment, je travaille avec cette solution plutôt délicate:

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

mais ceci est maintenant spécifique aux paramètres régionaux allemands - évidemment, une solution complètement indépendante serait beaucoup plus agréable.

L'OS en question est Server 2008. Je préférerais de loin ne pas utiliser un outil tiers, si possible.

Pekka
la source

Réponses:

22

Il y a eu quelques tentatives ( Rob van der Woude avait quelque chose), mais rien n'a vraiment fonctionné dans toutes les localités. Cependant, vous pouvez obtenir l'heure actuelle dans un format facilement analysable via

wmic os get LocalDateTime

Ce qui suit vous donne déjà au moins 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%

Cependant, vous devez probablement prendre en compte le décalage de fuseau horaire (sauf si c'est pour un fichier journal, alors j'utiliserais toujours UTC) mais ce n'est rien qu'un calcul ne peut faire :-)

Joey
la source
1
Excellent, cela ressemble exactement à ce dont j'ai besoin! Je vous remercie.
Pekka
2
Pour mémoire: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xc'est un tout petit peu plus joli. Il existe également une version plus compacte disponible ici , à savoir dans ce commentaire .
Tomalak
C'est un peu difficile de trouver et de mettre à jour toutes les anciennes instances où vous avez écrit quelque chose :). J'utiliserais probablement Win32_UTCTime et Win32_LocalTime maintenant.
Joey
vraiment fantastique!
jeromerg
Comme le dit @Tomalak, la findstrsolution est bien meilleure, comme pour mon cas, l'original for(sans le skip) réitère 3 fois. Une fois pour le mot "LocalDateTime", une deuxième fois pour la date réelle et une troisième fois pour une valeur vide (peut-être un saut de ligne?).
cavpollo
9

Voici une double ligne que j'utilise, qui semble fonctionner indépendamment de la version de Windows ou des paramètres d'heure 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%

Cela définira une variable appelée% CUR_DATE% au format standard ISO suivant:

yyyy-mm-dd

J'ai essayé d'en faire une doublure avec &&, mais cela ne semblait pas prendre, alors j'ai eu recours à la version à deux lignes. J'espère que cela t'aides.

Porte Vocatus
la source
0

J'utilise cette astuce pour obtenir 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%

Cependant, cela a pour effet secondaire de changer brièvement l'ensemble du système en UTC. C'est probablement OK sur un poste de travail personnel, mais je ne sais pas quel serait l'impact sur un grand serveur de production, qui devrait probablement être réglé sur UTC de toute façon.

mark d drake
la source