web-dev-qa-db-ja.com

バッチファイルのロケール非対応%DATE%および%TIME%?

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

残念ながら、これらの値はロケールに対応しています!たとえば、ドイツのマシンでは、

26.1.2011

の代わりに

2011-26-01

この変数をファイル名で使用する場合は、並べ替えが失敗します。

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

当分の間、私はこのかなり慎重な回避策で作業しています:

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

しかし、これは現在、ドイツ語のロケール固有です-明らかに、完全に独立したソリューションはmuchより良いでしょう。

問題のOSはServer 2008です。可能であれば、サードパーティのツールを使用しない方がいいと思います。

17
Pekka

いくつかの試みがありましたが( 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を使用します)。

23
Joey

以下は、私が使用している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

&&で1行にしてみましたが、うまく行かないようだったので、2行バージョンに切り替えました。お役に立てれば。

10
Vocatus Gate

このトリックを使用して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に設定する必要があります。

0
mark d drake