- 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の時刻差を出力します。
|