時間(hh:mm:ss)同士の計算

時間(hh:mm:ss)同士の加算や減算などの計算を行うには、次のような方法で可能です。
なお、小数点以下には対応していません。

関数定義

JavaScript

var timeMath = {
	/**
	 * 加算
	 */
	sum : function() {
		var result, times, second,
			len = arguments.length;

		if (len === 0) return;

		for (var i = 0; i < len; i++) {
			if (!arguments[i] || !arguments[i].match(/^[0-9]+:[0-9]{2}:[0-9]{2}$/)) continue;

			times = arguments[i].split(':');

			second = this.toSecond(times[0], times[1], times[2]);

			if ((!second && second !== 0)) continue;

			if (i === 0) {
				result = second;
			} else {
				result += second;
			}
		}

		return this.toTimeFormat(result);
	},

	/**
	 * 減算
	 */
	sub : function() {
		var result, times, second,
			len = arguments.length;

		if (len === 0) return;

		for (var i = 0; i < len; i++) {
			if (!arguments[i] || !arguments[i].match(/^[0-9]+:[0-9]{2}:[0-9]{2}$/)) continue;

			times = arguments[i].split(':');

			second = this.toSecond(times[0], times[1], times[2]);

			if (!second) continue;

			if (i === 0) {
				result = second;
			} else {
				result -= second;
			}
		}

		return this.toTimeFormat(result);
	},

	/**
	 * 乗算
	 */
	multiply : function() {
		var result, times, second,
			len = arguments.length;

		if (len === 0) return;

		for (var i = 0; i < len; i++) {
			if (!arguments[i] || !arguments[i].match(/^[0-9]+:[0-9]{2}:[0-9]{2}$/)) continue;

			times = arguments[i].split(':');

			second = this.toSecond(times[0], times[1], times[2]);

			if (!second) continue;

			if (i === 0) {
				result = second;
			} else {
				result *= second;
			}
		}

		return this.toTimeFormat(result);
	},

	/**
	 * 除算
	 */
	division : function() {
		var result, times, second,
			len = arguments.length;

		if (len === 0) return;

		for (var i = 0; i < len; i++) {
			if (!arguments[i] || !arguments[i].match(/^[0-9]+:[0-9]{2}:[0-9]{2}$/)) continue;

			times = arguments[i].split(':');

			second = this.toSecond(times[0], times[1], times[2]);

			if (!second) continue;

			if (i === 0) {
				result = second;
			} else {
				result /= second;
			}
		}

		return this.toTimeFormat(result);
	},

	/**
	 * 時間を秒に変換
	 */
	toSecond : function(hour, minute, second) {
		if ((!hour && hour !== 0) || (!minute && minute !== 0) || (!second && second !== 0) ||
			hour === null || minute === null || second === null ||
			typeof hour === 'boolean' ||
			typeof minute === 'boolean' ||
			typeof second === 'boolean' ||
			typeof Number(hour) === 'NaN' ||
			typeof Number(minute) === 'NaN' ||
			typeof Number(second) === 'NaN') return;

		return (Number(hour) * 60 * 60) + (Number(minute) * 60) + Number(second);
	},

	/**
	 * 秒を時間(hh:mm:ss)のフォーマットに変換
	 */
	toTimeFormat : function(fullSecond) {
		var hour, minute, second;

		if ((!fullSecond && fullSecond !== 0) || !String(fullSecond).match(/^[\-0-9][0-9]*?$/)) return;

		var paddingZero = function(n) {
			return (n < 10)  ? '0' + n : n;
		};

		hour   = Math.floor(Math.abs(fullSecond) / 3600);
		minute = Math.floor(Math.abs(fullSecond) % 3600 / 60);
		second = Math.floor(Math.abs(fullSecond) % 60);

		minute = paddingZero(minute);
		second = paddingZero(second);

		return ((fullSecond < 0) ? '-' : '') + hour + ':' + minute + ':' + second;
	}
};

使い方

引数に算出する時間を「hh:mm:ss」の書式で指定します。
戻り値は計算に成功した場合は算出された文字列、失敗した場合はundefinedを返します。

JavaScript

var result1 = timeMath.sum('12:34:56', '00:12:34'),
    result2 = timeMath.sub('12:34:56', '00:12:34'),
    result3 = timeMath.multiply('12:34:56', '00:00:02'),
    result4 = timeMath.division('12:34:56', '00:00:02');

alert(result1); // 12:47:30
alert(result2); // 12:22:22
alert(result3); // 25:09:52
alert(result4); // 6:17:28

JavaScript逆引きリファレンス一覧へ戻る