timestring/index.js

143 lines
2.7 KiB
JavaScript
Raw Normal View History

2016-01-15 21:05:30 +01:00
var _ = require('lodash');
2016-01-15 12:00:03 +01:00
/**
* Exports
*/
2016-01-15 21:05:30 +01:00
module.exports = parseTimestring;
2016-01-15 11:00:12 +01:00
2016-01-15 12:00:03 +01:00
/**
2016-01-15 21:05:30 +01:00
* Default options to use when parsing a timestring
2016-01-15 12:00:03 +01:00
*
2016-01-15 21:05:30 +01:00
* @type {Object}
2016-01-15 12:00:03 +01:00
*/
2016-01-15 21:05:30 +01:00
var defaultOpts = {
hoursPerDay: 24,
daysPerWeek: 7,
weeksPerMonth: 4,
monthsPerYear: 12,
};
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
/**
* Map of accepted strings to unit
*
* @type {Object}
*/
var unitMap = {
s: ['s', 'sec', 'secs', 'second', 'seconds'],
m: ['m', 'min', 'mins', 'minute', 'minutes'],
h: ['h', 'hr', 'hrs', 'hour', 'hours'],
d: ['d', 'day', 'days'],
w: ['w', 'week', 'weeks'],
mth: ['mth', 'mths','month', 'months'],
y: ['y', 'yr', 'yrs', 'year', 'years'],
};
/**
* Parse a timestring
*
* @param {string} string
* @param {string} [returnUnit]
* @param {Object} [opts]
* @return {number}
*/
function parseTimestring(string, returnUnit, opts) {
opts = _.extend(_.clone(defaultOpts), opts || {});
var totalSeconds = 0;
var unitValues = getUnitValues(opts);
var groups = string
.toLowerCase()
.replace(/[^\.\w+-]+/g, '')
.match(/[-+]?[0-9]+[a-z]+/g);
if (groups !== null) {
_.each(groups, function(group) {
var value = group.match(/[0-9]+/g)[0];
var unit = group.match(/[a-z]+/g)[0];
totalSeconds += getSeconds(value, unit, unitValues);
});
}
if (returnUnit) {
return convert(totalSeconds, returnUnit, unitValues);
}
return totalSeconds;
}
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
/**
* Get unit values based on the passed options
*
* @param {Object} opts
* @returns {Object}
*/
function getUnitValues(opts) {
var unitValues = {
2016-01-15 11:00:12 +01:00
s: 1,
m: 60,
h: 3600,
};
2016-01-15 21:05:30 +01:00
unitValues.d = opts.hoursPerDay * unitValues.h;
unitValues.w = opts.daysPerWeek * unitValues.d;
unitValues.mth = opts.weeksPerMonth * unitValues.w;
unitValues.y = opts.monthsPerYear * unitValues.mth;
return unitValues;
2016-01-15 11:00:12 +01:00
}
2016-01-15 12:00:03 +01:00
/**
2016-01-15 21:05:30 +01:00
* Get the key for a unit
2016-01-15 12:00:03 +01:00
*
2016-01-15 21:05:30 +01:00
* @param {string} unit
* @returns {string}
2016-01-15 12:00:03 +01:00
*/
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
function getUnitKey(unit) {
for (var k in unitMap) {
for (var u in unitMap[k]) {
if (unit === unitMap[k][u]) {
return k;
2016-01-15 11:00:12 +01:00
}
}
}
2016-01-15 21:05:30 +01:00
throw new Error('The unit [' + unit + '] is not supported by timestring');
}
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
/**
* Get the number of seconds for a value, based on the unit
*
* @param {number} value
* @param {string} unit
* @param {Object} unitValues
* @returns {number}
*/
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
function getSeconds(value, unit, unitValues) {
var baseValue = unitValues[getUnitKey(unit)];
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
return value * baseValue;
}
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
/**
* Convert a value from its existing unit to a new unit
*
* @param {number} value
* @param {string} unit
* @param {Object} unitValues
* @returns {number}
*/
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
function convert(value, unit, unitValues) {
var baseValue = unitValues[getUnitKey(unit)];
2016-01-15 11:00:12 +01:00
2016-01-15 21:05:30 +01:00
return value / baseValue;
}