トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

WinBat/DateTime

INDEX

バッチで日時の取得と日付計算処理

日時取得

下記の環境変数で日付・時刻が取得できる。ただし、表示する書式はOSの設定に依存する。
環境変数名 表示文字列(2000) 表示文字列(XP/2003)
日付 %DATE% 日 2003/11/02 2003/11/02
時刻 %TIME% 3:20:08.70 3:20:08.70

時刻は、10時前だと先頭(時の十の位)が空白になる。空白では都合が悪い場合は「%TIME: =0%」として空白を'0'へ置換して利用する。

Windows 2000 の場合、先頭に曜日が含まれてしまう。この曜日を取り除くため「%DATE:~-10%」として後の10文字を取り出し利用する。XP,2003でも後10文字は同じため、そのまま利用することが出来る。

 日時をファイル名に使う

環境変数で日付・時刻が取得できるが、日時の区切り文字にファイル名に使えない'/'や':'が使えない。なので使えない文字を削除もしくは置換する必要がある。SETコマンドの置換機能で文字を削る。

SET YYYYMMDD=%DATE:~-10%
SET YYYYMMDD=%YYYYMMDD:/=%
SET HHMISS=%TIME: =0%
SET HHMISS=%HHMISS:~0,8%
SET HHMISS=%HHMISS::=%
SET LOGFILE=EXECNAME.%YYYYMMDD%HHMISS%.LOG

 日時の分解

環境変数で日付・時刻が取得できるので、SETコマンドの展開の副文字列を指定して各要素に分解する。

SET YYYYMMDD=%DATE:~-10%
SET YY=%YYYYMMDD:~0,4%
SET MM=%YYYYMMDD:~5,2%
SET DD=%YYYYMMDD:~8,2%
SET HHMISSFF=%TIME: =0%
SET HH=%HHMISSFF:~0,2%
SET MI=%HHMISSFF:~3,2%
SET SS=%HHMISSFF:~6,2%
SET FF=%HHMISSFF:~9,2%

日付計算

日付・時刻計算を行うコマンドは用意されていない。SETコマンドの /A オプションによる数値演算が出来るので、一応日付計算は出来る。しかし、VBS の DateAdd() 関数などを利用する方が楽で正確である。

 VBSを利用して日付計算を行う

VBScript の DateAdd 関数を利用して日付計算を行う。関数は、第一引数が追加する単位、第二引数が追加する値、第三引数が日付を示す文字列となる(詳細はリファレンス参照)。

スクリプトの引数に日付と追加する値を指定し、計算結果が標準出力に出力されるので、FOR /F で受け取り環境変数へセットし直す。DateAdd は日付型で出力されるので YYYY/MM/DD の形式でセットされる。

SET YYMMDD=%DATE:~-10%
ECHO %YYMMDD% → 2014/08/16

ECHO WScript.Echo DateAdd(Wscript.Arguments(0), Wscript.Arguments(1), Wscript.Arguments(2))>DateAdd.vbs
FOR /F %%A IN ('cscript //Nologo DateAdd.vbs d -1 %YYMMDD%') DO SET YYMMDD=%%A

ECHO %YYMMDD% → 2014/08/15

 PowerShellを利用して日付計算を行う

PowerShell の AddDays 関数を利用して日付計算を行う。文字列を DateTime 型に変換し、日付計算を行って、ToString で文字列にして返す。日付書式は カスタム日付書式 で指定する。

SET YYMMDD=%DATE:~-10%
ECHO %YYMMDD% → 2014/08/16

FOR /F %%A IN ('powershell "[DateTime]::ParseExact('%YYMMDD%','yyyy/MM/dd',$null).AddDays(-1).ToString('yyyy/MM/dd')"') DO SET YYMMDD=%%A

ECHO %YYMMDD% → 2014/08/15

 1日前の日付をバッチのみで求める

SET /A コマンドで数値計算をし前日を求める。月初の場合(日付を-1日して0となる)は、月(1月の場合は年も)を減らす。

前日を求める際、8日,9日のとき、そのままでは 08, 09 となり先頭に0があるため8進数表記でエラーとなる。そのため先頭に1を付け 109-1 で計算して、下2桁のみ文字列として切り出す。また、月またぎの処理で月日をSETするとき、SETコマンドは後ろの空白も含めてしまうため空白を入れないようにする必要がある。さらに、閏年の3月1日のときは2月29日にする。閏年の判断は、400で割り切れる場合は閏年(%LEAP%=0)、100で割り切れる場合は平年(%LEAP%=-1)、それ以外は4で割り切れるかで判断する。

REM 対象日付
SET YYYYMMDD=%DATE:~-10%
SET YY=%YYYYMMDD:~0,4%
SET MM=%YYYYMMDD:~5,2%
SET DD=%YYYYMMDD:~8,2%
ECHO 対象日付 %YY%年 %MM%月 %DD%日


REM 前日を求める
SET /A DD=1%DD%-1
SET DD=%DD:~-2%

REM (グレゴリオ暦)閏年か
SET /A LEAP=%YY% %% 400
IF NOT %LEAP%==0 SET /A LEAP=%YY% %% 100 - 1
IF NOT %LEAP%==-1 SET /A LEAP=%YY% %% 4

REM 月またぎの対応
IF "X%DD%"=="X00" (
IF "X%MM%"=="X01" (SET MM=12& SET DD=31& SET /A YY=%YY%-1)
IF "X%MM%"=="X02" (SET MM=01& SET DD=31)
IF "X%MM%"=="X03" (SET MM=02& SET DD=28& IF %LEAP%==0 SET DD=29)
IF "X%MM%"=="X04" (SET MM=03& SET DD=31)
IF "X%MM%"=="X05" (SET MM=04& SET DD=30)
IF "X%MM%"=="X06" (SET MM=05& SET DD=31)
IF "X%MM%"=="X07" (SET MM=06& SET DD=30)
IF "X%MM%"=="X08" (SET MM=07& SET DD=31)
IF "X%MM%"=="X09" (SET MM=08& SET DD=31)
IF "X%MM%"=="X10" (SET MM=09& SET DD=30)
IF "X%MM%"=="X11" (SET MM=10& SET DD=31)
IF "X%MM%"=="X12" (SET MM=11& SET DD=30)
)


REM 計算結果
ECHO 計算結果 %YY%年 %MM%月 %DD%日

最終更新時間:2014年08月16日 22時03分38秒 指摘や意見などあればSandBoxのBBSへ。