@easy-ds-bot/timeparser
Version:
Simply string time converter (en/ru). From "5d2h" to 439200000 ms
107 lines (106 loc) • 4.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeDeparser = exports.timeParser = exports.deparseTime = exports.parseTime = exports.limitsMap = exports.timeNamesMap = exports.timeRegExpNames = exports.timeRegExp = exports.limitms = void 0;
/** 316 centuries or 31600 years */
exports.limitms = 999_999_999_999_999;
exports.timeRegExp = {
1: /([0-9])+(ms|msec(|s)|milli|millisecond(|s)|мс|мсек|миллисекунд(|а|ы))/gi,
1_000: /([0-9])+(s|sec(|s)|second(|s)|с|сек|секунд(|а|ы))/gi,
60_000: /([0-9])+(m|min(|s)|minute(|s)|м|мин|минут(|а|ы))/gi,
3_600_000: /([0-9])+(h|hr(|s)|hour(|s)|ч|чс|час(|а|ов))/gi,
86_400_000: /([0-9])+(d|day(|s)|д|день|дн(|и|ей))/gi,
604_800_000: /([0-9])+(w|wk(|s)|week(|s)|н|нд|нед|недел(ь|и|ей))/gi,
2_592_000_000: /([0-9])+(mth(|s)|mnth(|s)|month(|s)|мес|месяц(|ы|ев))/gi,
22_118_400_000: /([0-9])+(y|yr(|s)|year(|s)|г|гд|год(|ы|ов)|лет)/gi,
};
exports.timeRegExpNames = {
"ms": /([0-9])+(ms|msec(|s)|milli|millisecond(|s)|мс|мсек|миллисекунд(|а|ы))/gi,
"s": /([0-9])+(s|sec(|s)|second(|s)|с|сек|секунд(|а|ы))/gi,
"m": /([0-9])+(m|min(|s)|minute(|s)|м|мин|минут(|а|ы))/gi,
"h": /([0-9])+(h|hr(|s)|hour(|s)|ч|чс|час(|а|ов))/gi,
"d": /([0-9])+(d|day(|s)|д|день|дн(|и|ей))/gi,
"w": /([0-9])+(w|wk(|s)|week(|s)|н|нд|нед|недел(ь|и|ей))/gi,
"mon": /([0-9])+(mon|mth(|s)|mnth(|s)|month(|s)|мес|месяц(|ы|ев))/gi,
"y": /([0-9])+(y|yr(|s)|year(|s)|г|гд|год(|ы|ов)|лет)/gi,
};
exports.timeNamesMap = {
1: "ms",
1_000: "s",
60_000: "m",
3_600_000: "h",
86_400_000: "d",
604_800_000: "w",
2_592_000_000: "mon",
22_118_400_000: "y",
};
//Ziggurat!!!
exports.limitsMap = {
1: Math.floor(exports.limitms / 1),
1_000: Math.floor(exports.limitms / 1_000),
60_000: Math.floor(exports.limitms / 60_000),
3_600_000: Math.floor(exports.limitms / 3_600_000),
86_400_000: Math.floor(exports.limitms / 86_400_000),
604_800_000: Math.floor(exports.limitms / 604_800_000),
2_592_000_000: Math.floor(exports.limitms / 2_592_000_000),
22_118_400_000: Math.floor(exports.limitms / 22_118_400_000),
};
const entriesRegExp = Object.entries(exports.timeRegExp);
/**
* Converts string time (e.g. `1d3h`) into milliseconds (`97_200_000`)
*
* One month = 30 days, one year = 365 days
*
* Returns `null` if `time > 31600 years` or if `time == 0 ms`
*/
function parseTime(time) {
let result = 0;
let result_matches = [];
for (const [ms, rx] of entriesRegExp) {
let matches = time.match(rx);
if (matches === null)
continue;
for (let match of matches)
time = time.replace(match, '');
result_matches = result_matches.concat(...matches);
let matches_nums = matches.map($ => Number($.match(/([0-9])/g)?.join('') ?? 0)).reduce((a, b) => a + b);
if (matches_nums > exports.limitsMap[Number(ms)])
return null;
result += matches_nums * Number(ms);
}
if (result == 0)
return null;
return {
get _deparsed() { return deparseTime(result); },
_matches: result_matches,
ms: result,
get seconds() { return result / 1_000; },
get minutes() { return result / 60_000; },
get hours() { return result / 3_600_000; },
get days() { return result / 86_400_000; },
get weeks() { return result / 604_800_000; },
get months() { return result / 2_592_000_000; },
get years() { return result / 22_118_400_000; },
};
}
exports.parseTime = parseTime;
/**
* Converts milliseconds into string time
*
* One month = 30 days, one year = 365 days
*/
function deparseTime(ms, separator = '') {
let result = [];
for (let remainder = ms; remainder > 0;)
for (const [time, name] of Object.entries(exports.timeNamesMap).reverse()) {
const count = Math.floor(remainder / Number(time));
if (count) {
remainder -= count * Number(time);
result.push(`${count}${name}`);
}
}
return result.join(separator);
}
exports.deparseTime = deparseTime;
exports.timeParser = parseTime;
exports.timeDeparser = deparseTime;
exports.default = exports.timeParser;