#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(機能別)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS