Windows - バッチ - 時刻の演算

クラウディア 
1. 概要
2. 時刻の演算 分の加算
3. 時刻の演算 時刻の差

1. 概要

 Windows のバッチファイルで扱える変数の型は、基本的には文字型のみで、派生的に数値型の演算は可能ですが、時刻・時間の型がないので演算は簡単には出来ない。  ちょっと調べてみると「VBScript 使っちゃえば?」ってのが大多数のようです。  ひとつ演算できそうなのがありましたのでやってみます。  本項は「バッチファイルで時間の計算(分単位) 」を参考にさせていただきました。

2. 時刻の演算 分の加算

 参考サイトのものを少しだけいじって、引数を与えるようにしました。

@ECHO  OFF

REM 【ARGV1】は時刻  【ARGV2】は加算/減算する時間(分単位)

SET ARGV1=%1
SET ARGV2=%2

IF "%ARGV1:~3,1%" EQU "0" (SET /A MINUTE=%ARGV1:~4,1%) ELSE (SET /A MINUTE=%ARGV1:~3,2%)
IF "%ARGV1:~0,1%" EQU "0" (SET /A HOUR=%ARGV1:~1,1%)   ELSE (SET /A HOUR=%ARGV1:~0,2%)

SET /A MINTOTAL=HOUR*60+MINUTE+ARGV2

IF %MINTOTAL% LSS 0 SET /A MINTOTAL+=((-MINTOTAL/1440+1)*1440)
SET /A MINTOTAL%%=1440
SET /A HOUR=MINTOTAL / 60
SET /A MINUTE=MINTOTAL %% 60

IF %MINUTE% LSS 10 SET MINUTE=0%MINUTE%
IF %HOUR% LSS 10 SET HOUR=0%HOUR%

SET RESULT=%HOUR%:%MINUTE%
ECHO %RESULT%
 少し解説しておきます。  8、9行目は、少し加工しました。  参考サイトでは、00:00 ~ 09:59 の表記は 0:00 ~ 9:59 にしています。:(コロン)より前と後ろに分けているのと 0 始まりの数字は数値化するときに8進数と思ってしまうためで・・・。  10の位が 0 か否かで場合分けして数値化する文字数を1文字か2文字かに分けています。  1440 は、60×24=1440 で1日あたりの分です。  引数1の時刻を分単位にして引数2を加算。  結果を60の商と剰余にわけて時刻に逆変換するという方法ですな。  参考サイトの方、あったまいい!  ありがたく、使わせていただきます。

3. 時刻の演算 時刻の差

 ちびっと応用してみます。

@ECHO  OFF

REM 【ARGV1】【ARGV2】は時刻

SET ARGV1=%1
SET ARGV2=%2

IF "%ARGV1:~3,1%" EQU "0" (SET /A MINUTE1=%ARGV1:~4,1%) ELSE (SET /A MINUTE1=%ARGV1:~3,2%)
IF "%ARGV1:~0,1%" EQU "0" (SET /A HOUR1=%ARGV1:~1,1%)   ELSE (SET /A HOUR1=%ARGV1:~0,2%)

IF "%ARGV2:~3,1%" EQU "0" (SET /A MINUTE2=%ARGV2:~4,1%) ELSE (SET /A MINUTE2=%ARGV2:~3,2%)
IF "%ARGV2:~0,1%" EQU "0" (SET /A HOUR2=%ARGV2:~1,1%)   ELSE (SET /A HOUR2=%ARGV2:~0,2%)

SET /A MINTOTAL=HOUR1*60+MINUTE1-(HOUR2*60+MINUTE2)

if %MINTOTAL% LSS 0 SET /A MINTOTAL+=((-MINTOTAL/1440+1)*1440)
SET /A MINTOTAL%%=1440
SET /A HOUR=MINTOTAL / 60
SET /A MINUTE=MINTOTAL %% 60

if %MINUTE% LSS 10 SET MINUTE=0%MINUTE%
if %HOUR%   LSS 10 SET HOUR=0%HOUR%

SET RESULT=%HOUR%:%MINUTE%
ECHO %RESULT%
 下記の形式で実行すると

バッチファイル名 HH:MM HH:MM
 引数1と引数2の時刻差を出力します。