はじめに
GASで時間計算をしたい場合、皆さんはどうしているでしょうか?
いろいろややこしい仕様があって、私は苦労していますね。
今回は、24時間を超える時間を計算したいときにどうすればいいのか、複数の時間を計算するにはどんな関数を作ればいいのかを紹介します。
24時間を超える計算をしたい場合。
上のバーの「表示形式の詳細設定」から「経過時間」をクリックすることで、24時間以上の時間を表示できます。
さらに、「h:mm」の形式にしたい場合は、「カスタム日時」から選択してください。
時間を足す関数
時間の足し引きをする場合、Date関数には年月日の情報も含まれているシリアル値で計算しているため、すこしややこしいです。
そのため、時間は時間、分は分として計算することで、シリアル値で計算しないようにしてみました。
function sumTime(...args) {
Logger.log("sumTime入力: " + args);
let sumHours = 0;
let sumMinutes = 0;
for (let i = 0; i < args.length; i++) {
if (args[i].getFullYear() === 1899 && args[i].getMonth() === 11 && args[i].getDate() === 31) {
sumHours += args[i].getHours() + 24;
} else {
sumHours += args[i].getHours();
}
sumMinutes += args[i].getMinutes();
}
const sumDate = new Date(1899, 11, 30, sumHours, sumMinutes);
Logger.log("sumTime出力: " + sumDate);
return sumDate;
}
if (args[i].getFullYear() === 1899 && args[i].getMonth() === 11 && args[i].getDate() === 31) {
sumHours += args[i].getHours() + 24;
この部分は、24時間を超える場合の処理です。monthが11なのは、12月を11で表すからですね。
普通に計算すると「1899年12月30日」の時間が使われるようなので、24時間を超えると31日になります。
31日の場合に、hourに+24をしているというわけですね。
引数には、可変朝引数を使っています。
これで複数の時間の足し算を一度にできます。
最後に、1899年12月30日の日付で時間を返しています。
時間や分が基準を超える場合には、繰り上がりが起こります。
時間の引き算
時間の引き算もシリアル値での計算をしてしまうと、うまくいかないと思います。
なので、時間と分を分けて計算してみました。
function diffTime(t1, ...args) {
Logger.log("diffTime入力: " + [t1, ...args]);
let t1Flg = false;
if (t1.getFullYear() === 1899 && t1.getMonth() === 11 && t1.getDate() === 31) {
t1Flg = true;
}
let t1Hour = t1.getHours();
if (t1Flg) {
t1Hour = t1Hour + 24
}
let t1Min = t1.getMinutes();
let sumHours = 0;
let sumMinutes = 0;
for (let i = 0; i < args.length; i++) {
if (args[i].getFullYear() === 1899 && args[i].getMonth() === 11 && args[i].getDate() === 31) {
sumHours += args[i].getHours() + 24;
} else {
sumHours += args[i].getHours();
}
sumMinutes += args[i].getMinutes();
}
const diffHour = t1Hour - sumHours;
const diffMinute = t1Min - sumMinutes;
const date = new Date(1899, 11, 30, diffHour, diffMinute);
Logger.log("diffTime出力: " + date);
return date;
}
t1から他の可変長引数を引くという形をとっています。
1899年12月31日については足し算で説明しています。
引数をすべて足して、t1(time1)から引いていることがコードからわかると思います。
おわりに
いかがだったでしょうか。
GASで時間を計算するのは、少々面倒くさいですね。
もっと簡単なやり方があればぜひコメントしていただきたいです。
dayjsやmoment.jsなどでのコードの案なども歓迎です!