DOSバッチで日付・時刻の取得

DOSバッチを書いているとログを日付・時刻入りで出力したくなります。

xxxxx_20071123_06000102.log

というログとか。
基本的には環境変数の、%date% と %time% の文字列操作をすれば出来るのですが、
%time% がちょっと曲者です。

%time% は、 20:00 など時間が二桁の場合は良いのですが、 2:00 など時間が
一桁の場合は ' 2:00' という半角スペース付きで返してくれます。

>echo %time%
 2:00:18.54

そこで %time% に対して文字列操作して、半角スペースを0に置換します。

>echo %time: =0%

あとは、時刻文字列の切り貼りをすればOK。

>set time_tmp=%time: =0%
>set time_tmp=%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%%time_tmp:~9,2%
>echo %time_tmp%
02474721

で、よく使いそうなのでバッチ化してみました。test.batは呼出しのサンプルです。

datetime.bat

このバッチを実行すると環境変数に日付・時刻が保存されます。

%yyyy% 年4桁
%yy% 年2桁
%mm% 月
%dd% 日
%hh% 時
%mi% 分
%ss% 秒
%sss% ミリ秒2桁
%datetime% 年4桁〜ミリ秒2桁

@echo off
set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set time_tmp=
set date_tmp=

test.bat

datetime.bat の実行用サンプルです。

@echo off

setlocal

call datetime.bat

echo %datetime%
echo %yyyy%-%mm%-%dd% %hh%:%mi%:%ss%.%sss%
echo %date% %time%

endlocal

実行してみる。

>test.bat
2007112302443090
2007-11-23 02:44:30.90
2007/11/23  2:44:30.92

注.datetime.bat は、実行した時点の %date% %time% の内容を環境変数に保存しているので、再実行するまで日時は更新されないです。