Convert Seconds to Human Readable Duration

From Hawk Wiki
Jump to: navigation, search
/**
 * Convert to human readable time duration
 * @param seconds
 * @param desiredUnit {string} The desired unit. can be "W", "D", "H", "M"
 *        unitCount {number} How many units to show
 * @returns {
 *           value: {number} seconds input,
 *           text: {string} "Time remaining text",
 *           secondsLeft: {number} seconds left not showing in the text
 *          }
 *	(ignore the unit smaller than the 2nd unit. if desiredUnit = "D", unitCount = 2, 1d1m show "1d")
 */
var toHumanReadableDuration = function (seconds, desiredUnit, unitCount) {
		var that = this;
		/**
		 * Return a text with number and unit
		 * @param number the number
		 * @param unitName the unit text
		 * @returns {*}
		 */
		var numberWithUnit = function (number, unitName) {
			return number + unitName;
		};

		// General function to return data based on unit and secondsInUnit
		var getTimeByUnit = function (secondsTmp, unit, secondsInUnit) {
			var ret = Math.floor(secondsTmp / secondsInUnit);
			return {
				value: ret,
				text: ret > 0 ? numberWithUnit(ret, unit) : "",
				// How many seconds left after Math.floor. Means how many second is omitted
				secondsLeft: secondsTmp - ret * secondsInUnit
			};
		};

		var ret = {
			value: seconds,
			text: "",
			secondsLeft: 0
		};
		//If the duration is <=0, just return
		if (seconds <= 0) {
			return ret;
		}
		// Call corresponding function based on the unit param
		var unitFuncMappings = [{
			"unit": "W",
			"secondsInUnit": 604800 //seconds in a week
		}, {
			"unit": "D",
			"secondsInUnit": 86400
		}, {
			"unit": "H",
			"secondsInUnit": 3600
		}, {
			"unit": "M",
			"secondsInUnit": 60
		}, {
			"unit": "S",
			"secondsInUnit": 1
		}];

		// Find the index of desired unit
		var unitIndex = 0,
			i;
		for (i = 0; i < unitFuncMappings.length; i++) {
			if (unitFuncMappings[i].unit == unit) {
				unitIndex = i;
				break;
			}
		}

		// Get the time format for desired unitCount
		for (i = unitIndex; i < unitFuncMappings.length; i++) {
			if (getTimeByUnit(seconds, unitFuncMappings[i].unit, unitFuncMappings[i].secondsInUnit).value > 0) {
				for (var j = 0; j < unitCount; j++) {
					if (unitFuncMappings[i + j]) {
						var retTmp = getTimeByUnit(seconds, unitFuncMappings[i].unit, unitFuncMappings[i].secondsInUnit);
						if (j > 0) {
							ret.text += " "; // add a space between time units
						}
						ret.text += retTmp.text;
						ret.secondsLeft = retTmp.secondsLeft;
						seconds = retTmp.secondsLeft; //refresh seconds for next calculation
					}
				}
				break;
			}
		}
		return ret;
	}