time-number
Version:
Converts time representation from string to number or from number to string
197 lines (146 loc) • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.timeFromInt = timeFromInt;
exports.timeToInt = timeToInt;
function isOwnException(ex) {
return ex.message.substring(0, 11) === 'time-number';
}
function leftPadding(value) {
var len = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
var sValue = value.toString();
var lLen = len - sValue.length;
var l = '';
while (l.length < lLen) {
l += '0';
}
return '' + l + sValue;
}
function internalTimeFromInt(val, _ref) {
var validate = _ref.validate,
format = _ref.format,
leadingZero = _ref.leadingZero;
var value = parseInt(val, 10);
if (validate && (value < 0 || value >= 24 * 3600)) {
throw new RangeError('time-number, timeFromInt(): rangeError, value supposed to be between 0 and 86399');
}
var hours = Math.floor(value / 3600);
var minutes = Math.floor((value - hours * 3600) / 60);
var seconds = value - hours * 3600 - minutes * 60;
var ampm = null;
if (format === 12 || format === '12') {
ampm = hours < 12 ? 'AM' : 'PM';
if (hours === 0) {
hours = 12;
} else if (hours > 12) {
hours -= 12;
}
}
var ret = [leadingZero ? leftPadding(hours) : hours, leftPadding(minutes)];
if (seconds) {
ret.push(leftPadding(seconds));
}
var timeString = ret.join(':');
if (ampm) {
return timeString + ' ' + ampm;
}
return timeString;
}
function compatv1(params) {
if (typeof params === 'boolean') {
return { validate: params };
}
return params;
}
function timeFromInt(val) {
var providedParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var defaults = { validate: true, format: 24, leadingZero: true };
var params = Object.assign({}, defaults, compatv1(providedParams));
var validate = params.validate;
if (!validate) {
return internalTimeFromInt(val, params);
}
try {
if (val - parseFloat(val, 10) + 1 >= 0) {
return internalTimeFromInt(val, params);
}
throw new Error();
} catch (ex) {
if (isOwnException(ex)) {
throw ex;
}
throw new Error('time-number, timeFromInt(): invalud value: \'' + val + '\', supposed to be number');
}
}
function internalTimeToInt(val, _ref2) {
var validate = _ref2.validate;
var times = val.split(':');
var len = times.length;
while (times.length < 3) {
times.push('0');
}
var iTimes = times.map(function (i) {
return parseInt(i, 10);
});
if (validate) {
var hours = iTimes[0];
if (hours < 0 || hours > 23) {
throw new RangeError('time-number, timeToInt(): hours must be between 0 and 23, provided value: \'' + val + '\'');
}
if (len > 1) {
var minutes = iTimes[1];
if (minutes < 0 || minutes > 59) {
throw new RangeError('time-number, timeToInt(): minutes must be between 0 and 59, provided value: \'' + val + '\'');
}
}
if (len > 2) {
var seconds = iTimes[2];
if (seconds < 0 || seconds > 59) {
throw new RangeError('time-number, timeToInt(): seconds must be between 0 and 59, provided value: \'' + val + '\'');
}
}
}
return iTimes[0] * 3600 + iTimes[1] * 60 + iTimes[2];
}
function internal12To24(val) {
if (!val || !val.match) {
return val;
}
if (!val.match(/(am|pm)$/i)) {
return val;
}
if (val.match(/^0+:/)) {
throw new Error('12h format can\'t have 00:30 AM, it should be 12:30 AM instead');
}
if (val.match(/am$/i)) {
return val.replace(/^(\d+)/, function (m) {
return m === '12' ? '0' : m;
}).replace(/\s*am$/i, '');
}
return val.replace(/^(\d+)/, function (m) {
return m === '12' ? m : (parseInt(m, 10) + 12).toString();
}).replace(/\s*pm$/i, '');
}
function timeToInt(value) {
var providedParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var defaults = { validate: true };
var params = Object.assign({}, defaults, compatv1(providedParams));
var validate = params.validate;
if (!validate) {
var val = internal12To24(value);
return internalTimeToInt(val, params);
}
try {
var _val = internal12To24(value);
if (!_val.match(/^\d+(:\d+(:\d+)?)?$/)) {
throw new Error();
}
return internalTimeToInt(_val, params);
} catch (ex) {
if (isOwnException(ex)) {
throw ex;
}
throw new Error('time-number, timeToInt(): supported formats are \'HH\', \'HH:mm\', \'HH:mm:ss\', provided value: \'' + value + '\' doesn\'t match any of them');
}
}