バッチファイルのロケールを認識しない%DATE%および%TIME%?


16

環境変数は、コマンドラインで、バッチファイル内のWindowsマシン上の現在の日付と時間を提供します。%DATE%%TIME%

残念ながら、これらの値はロケールに対応しています!つまり、ドイツのマシンでは、次のようになります

26.1.2011

の代わりに

2011-26-01

この変数をファイル名で使用する場合、これはソートを台無しにします。

YYYY-MM-DDWindowsバッチファイルでロケールを認識しない日付文字列を取得する簡単な方法はありますか?

とりあえず、私はこのかなり気味の悪い回避策に取り組んでいます:

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

しかし、これは現在ドイツのロケール固有です-明らかに、完全に独立したソリューションの方がずっといいでしょう。

問題のOSはServer 2008です。可能な限り、サードパーティのツールを使用しないことをお勧めします。

回答:


22

いくつかの試みがありましたが(Rob van der Woudeには何かありました)、すべてのロケールで実際に機能するものはありませんでした。ただし、次の方法で簡単に解析可能な形式で現在の時刻を取得できます

wmic os get LocalDateTime

以下は、少なくとも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%

ただし、おそらくタイムゾーンオフセットを考慮する必要があります(ログファイル用でない限り、常にUTCを使用します)が、それは少しの計算ではできないことではありません:-)


1
すばらしい、これはまさに私が必要とするもののように見えます!ありがとうございました。
ペッカ

2
記録のために:for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%x少しいいです。ここでは、よりコンパクトなバージョン、つまりそのコメント利用できます
トマラック14年

あなたが何かを書いたすべての古いインスタンスを見つけて更新するのは少し難しいです:)。おそらく今はWin32_UTCTimeとWin32_LocalTimeを使用するでしょう。
ジョーイ14年

本当に素晴らしい!
jeromerg

@Tomalakが言うように、findstr解決策ははるかに優れています。私の場合は、元のfor(なしskip)が3回繰り返されます。1 "LocalDateTime"回は単語、2回目は実際の日付、3回目は空の値(改行かもしれません)になります。
cavpollo

9

これは私が使用している2ライナーで、Windowsのバージョンや現地時間の設定に関係なく機能するようです。

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%

これにより、%CUR_DATE%という変数が次のISO標準形式で設定されます。

yyyy-mm-dd

&&でワンライナーにしようとしましたが、うまくいかないようだったので、2ラインバージョンに頼りました。お役に立てれば。


0

このトリックを使用して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%

ただし、システム全体を短時間でUTCに変更するという副作用があります。これはおそらくパーソナルワークステーションでは問題ありませんが、大規模な運用サーバーにどのような影響があるかはわかりません。おそらく、UTCに設定する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.