#navi(機能別) ''日時を環境変数に得る'' #contents //////////////////////////////////////////////////////////////////////////// *概要 [#w790739f] 環境変数に日時を得たいケースがある。 +時刻を得る +日付を得る +日付・時刻両方を得る の3パターンについて、dateやtimeコマンドを使う方法、 環境変数DATEやTIMEを使う方法それぞれについて記す。 地域のオプションで日付を和暦にしたり、時刻を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でなく空白となる 1.の理由だが、 :loop set X=%TIME%/%TIME% if %X:~0,11% == %X:~-11% goto loop を実行すると、しばらくしてループから抜ける。 つまり、同一の文でも複数回 %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.の問題も処理できる。 //////////////////////////////////////////////////////////////////////////// *日付をDATE環境変数から得る [#o423736b] Win2Kでは、yyyy/mm/dd の前に曜日が付くため、Win2KとWinXPの両方で動く スクリプトにしたければ、文字位置を後ろから数えて指定する。 前述の時刻と同様、レアケースだが日が変わるタイミングで実行すると 誤った日付となる可能性があるため、一旦別の環境変数にセットする必要がある。 set D=%DATE% set YYYYMMDD=%D:~-10,4%%D:~-5,2%%D:~-2% デリミタが / であるという前提を置いて良ければ、 set D=%DATE:/=% set YYYYMMDD=%D:~-8% さらに、WinXPに限定してよければ、 set YYYYMMDD=%DATE:/=% でよい。 //////////////////////////////////////////////////////////////////////////// *日時を得る [#d519e3dd] 日時を同一コマンドや同一環境変数で得ることは出来ないので、 日付と時刻を別々のタイミングで取得する必要がある。~ 日が変わるタイミング、例えば 2005/01/31 23:59:59.99 に日付を得て、 2005/02/01 00:00:00.00 に時刻を得ると、結果は 2005/01/31 00:00:00.00 と、 実際とは1日ずれてしまう。従って、日をまたがっていないチェックが必要。 set D=%DATE% :retry set T=%TIME: =0% if not %D% == %DATE% goto retry set YYYYMMDDHHMMSS=%D:~-10,4%%D:~-5,2%%D:~-2%%T:~0,2%%T:~3,2%%T:~6,2% date/t や time/t コマンドを使うことも出来るがどうせ一旦別の環境変数に セットする必要があるので、環境変数を使うほうが簡単である。 //////////////////////////////////////////////////////////////////////////// *年月日の順序が変更されれている状況で日付を得る [#t0415081] アメリカ式、ヨーロッパ式のように、年月日の順を変更している場合にでも 年月日を得る方法として、date コマンドの2行目を参照する方法がある。~ 年月日の順序を変更している場合、date コマンドの2行目の、 >新しい日付を入力してください: (年-月-日) のカッコの中の文字順序がそれに応じて変わることを利用する。 for /f "tokens=1-3 delims=/- " %%X in do ('date/t') ( for /f "tokens=2-4 skip=1 delims=/-() " %%A in ('date ^< NUL') do ( set %%A=%%X& set %%B=%%Y& set %%C=%%Z )) set YYYYDDMM=%年%%月%%日% set文では、環境変数 %年% %月% %日% にそれぞれ対応する値がセットされる。 日本語Windows以外にも対応するためには、コードページを一時的に英語に 変更して上記相当を実行し、その後コードページを復元する。 //////////////////////////////////////////////////////////////////////////// #navi(機能別)