Gebietsschema% DATE% und% TIME% in Batch-Dateien nicht bekannt?

15

Die Umgebungsvariablen %DATE%und %TIME%geben das aktuelle Datum und die aktuelle Uhrzeit auf Windows-Computern in der Befehlszeile und in einer Batchdatei an.

Leider sind diese Werte Gebietsschemas bewusst! Das heißt, dass Sie zum Beispiel auf einer deutschen Maschine erhalten

26.1.2011

Anstatt von

2011-26-01

Dadurch wird die Sortierung verkürzt, wenn Sie diese Variable in einem Dateinamen verwenden möchten.

Gibt es eine einfache Möglichkeit, eine YYYY-MM-DDDatumszeichenfolge mit unbekanntem Gebietsschema in einer Windows-Batchdatei abzurufen?

Im Moment arbeite ich mit dieser ziemlich klobigen Problemumgehung:

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

aber das ist jetzt deutsche länderspezifisches - offensichtlich eine völlig unabhängige Lösung wäre viel schöner.

Als Betriebssystem kommt Server 2008 in Frage. Ich würde es sehr bevorzugen, wenn überhaupt möglich, kein Drittanbieter-Tool zu verwenden.

Pekka unterstützt GoFundMonica
quelle

Antworten:

21

Es gab ein paar Versuche ( Rob van der Woude hatte etwas), aber nichts funktionierte wirklich in allen Regionen. Sie können die aktuelle Uhrzeit jedoch in einem einfach zu analysierenden Format über abrufen

wmic os get LocalDateTime

Mit dem folgenden Befehl erhalten Sie mindestens 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%

Allerdings müssen Sie wahrscheinlich den Zeitzonenversatz berücksichtigen (es sei denn, es handelt sich um eine Protokolldatei, dann würde ich immer UTC verwenden), aber das ist nichts, was ein bisschen Berechnung nicht kann :-)

Joey
quelle
1
Hervorragend, das sieht genau so aus, wie ich es brauche! Vielen Dank.
Pekka unterstützt GoFundMonica am
2
Für die Aufzeichnung: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xist ein kleines bisschen netter. Es gibt auch eine kompaktere Version hier , nämlich in diesem Kommentar .
Tomalak
Es ist etwas schwierig, alle alten Instanzen zu finden und zu aktualisieren, in denen Sie etwas geschrieben haben :). Ich würde jetzt wahrscheinlich Win32_UTCTime und Win32_LocalTime verwenden.
Joey
wirklich fantastisch!
Jeromerg
Wie @Tomalak sagt, ist die findstrLösung viel besser, da in meinem Fall das Original for(ohne das skip) dreimal iteriert. Einmal für das Wort "LocalDateTime", ein zweites Mal für das aktuelle Datum und ein drittes Mal für einen leeren Wert (möglicherweise ein Zeilenumbruch?).
Cavpollo
9

Hier ist ein Zweisitzer, den ich verwendet habe und der unabhängig von der Windows-Version oder den lokalen Zeiteinstellungen zu funktionieren scheint:

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%

Dadurch wird eine Variable mit dem Namen% CUR_DATE% im folgenden ISO-Standardformat festgelegt:

yyyy-mm-dd

Ich habe versucht, es mit && einzeilig zu machen, aber es schien nicht zu dauern, also habe ich auf die zweizeilige Version zurückgegriffen. Hoffe das hilft.

Vocatus-Tor
quelle
0

Ich benutze diesen Trick, um UTC zu bekommen ..

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%

Es hat jedoch den Nebeneffekt, dass das gesamte System kurzzeitig auf UTC umgestellt wird. Dies ist auf einer persönlichen Workstation wahrscheinlich in Ordnung, aber nicht sicher, welche Auswirkung ein großer Produktionsserver haben würde, der wahrscheinlich sowieso auf UTC eingestellt sein sollte.

markiere d drake
quelle