#navi(機能別) ''日時を環境変数に得る'' #contents //////////////////////////////////////////////////////////////////////////// *概要 [#w790739f] 環境変数に日時を得たいケースがある。 +時刻を得る +日付を得る +日付・時刻両方を得る の3パターンについて、dateやtimeコマンドを使う方法、 環境変数DATEやTIMEを使う方法それぞれについて記す。 WinXPの場合は地域オプションで日付を和暦にしたり、時刻を12時間制にした場合、 上記コマンドの結果や環境変数の値も影響を受ける((TIME環境変数は影響を受けない))。 ここでは地域オプションで、西暦・24時間制に設定していて、 得たい日時も西暦・24時間制だという前提とする。~ 日付の区切り文字はデフォルトでは / だが、JIS/ISO規格では - なので両方を想定。~ 時刻の区切り文字も変更できるが : 以外にするとは考えられないので想定しない。 日時機能については、[機能差異/Win2KとWinXP]も参照。 //////////////////////////////////////////////////////////////////////////// *時刻をtime/tコマンドで得る [#w8b2c88f] time/tコマンドで得られる結果の書式は HH:mm で秒は得られないが、 分までで十分な場合はこの方法が簡単である。 for /f "delims=: tokens=1,2" %%A in ('time/t') do set HH=%%A&set MM=%%B for /f "delims=: tokens=1,2" %%A in ('time/t') do set HHMM=%%A%%B //////////////////////////////////////////////////////////////////////////// *日付をdate/tコマンドで得る [#c7196ce1] date/tコマンドで得られる結果の書式は yyyy/mm/dd で、 Win2Kの場合は空白をはさんで曜日が後ろに付く。 for /f "tokens=1-3 delims=/- " %%A in ('date/t') do set Y=%%A&set M=%%B&set D=%%C for /f "tokens=1-3 delims=/- " %%A in ('date/t') do set YMD=%%A%%B%%C 空白もデリミタにする必要があるので、delims=/-と"の間に空白を置く。 //////////////////////////////////////////////////////////////////////////// *時刻をTIME環境変数から得る [#ja3e2234] 秒まで得たい場合は、time/tコマンドでは得られない。 set HHMMSS=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% というコードを目にすることがあるが、これには2点問題がある。 +タイミングによって誤った時刻が得られる +0〜9時台は先頭が0でなく空白となる :loop set X=%TIME%%TIME% if %X:~0,11% == %X:~-11% goto loop を実行すると、しばらくしてループから抜ける。 つまり、同一のset文で複数回%TIME%を参照するとその度に異なった時刻が得られる。~ 従って、例えば18時頃に上記のスクリプトを実行した場合、 最初の %TIME% 参照時に 17:59:59.99 で、2,3回目に 18:00:00.00 だった場合、 得られる HHMMSS は 170000と、実際の時間と1時間ずれることになる。 set T=%TIME: =0% set HHMMSS=%T:~0,2%%T:~3,2%%T:~6,2% のように、一旦別の環境変数にセットすることで1の問題を回避し、 その時 空白 を 0 に置換することで2の問題も処理できる。 //////////////////////////////////////////////////////////////////////////// #navi(機能別)