UNPKG

@easy-ds-bot/timeparser

Version:

Simply string time converter (en/ru). From "5d2h" to 439200000 ms

107 lines (106 loc) 4.47 kB
"use strict"; 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;