UNPKG

@beenotung/tslib

Version:
240 lines (239 loc) 6.91 kB
"use strict"; /** * Created by beenotung on 2017 Mar 9th. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.setLang = setLang; exports.format_byte = format_byte; exports.format_datetime = format_datetime; exports.round_time_diff = round_time_diff; exports.format_long_short_time = format_long_short_time; exports.format_time_duration = format_time_duration; exports.format_relative_time = format_relative_time; exports.format_2_digit = format_2_digit; exports.format_time_code = format_time_code; exports.format_timestamp_code = format_timestamp_code; exports.format_n_digit = format_n_digit; exports.format_percentage = format_percentage; const timezone_date_ts_1 = require("timezone-date.ts"); const en_1 = require("./en"); const locale_1 = require("./locale"); const time_1 = require("./time"); const size_units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const time_units_short = [ [time_1.CENTURY, 'century'], [time_1.DECADE, 'decade'], [time_1.YEAR, 'yr'], [time_1.MONTH, 'mo'], [time_1.WEEK, 'wk'], [time_1.DAY, 'd'], [time_1.HOUR, 'hr'], [time_1.MINUTE, 'min'], [time_1.SECOND, 's'], [time_1.MILLISECOND, 'ms'], ]; const time_units_en = [ [time_1.CENTURY, 'century'], [time_1.DECADE, 'decade'], [time_1.YEAR, 'year'], [time_1.MONTH, 'month'], [time_1.WEEK, 'week'], [time_1.DAY, 'day'], [time_1.HOUR, 'hour'], [time_1.MINUTE, 'minute'], [time_1.SECOND, 'second'], [time_1.MILLISECOND, 'millisecond'], ]; const time_units_zh = [ [time_1.CENTURY, '世紀'], [time_1.YEAR, '年'], [time_1.MONTH, '個月'], [time_1.WEEK, '週'], [time_1.DAY, '日'], [time_1.HOUR, '小時'], [time_1.MINUTE, '分鐘'], [time_1.SECOND, '秒'], [time_1.MILLISECOND, '毫秒'], ]; const word_en = { 'instantly': 'instantly', 'just now': 'just now', 'hence': 'hence', 'ago': 'ago', }; const word_zh = { 'instantly': '即時', 'just now': '剛剛', 'hence': '後', 'ago': '前', }; let word = word_en; let time_units = time_units_en; let locale = (0, locale_1.getEnvLocale)() || 'en'; function setLang(lang, flag) { locale = lang; if (lang.includes('zh')) { time_units = time_units_zh; word = word_zh; } else { time_units = flag == 'simple' ? time_units_short : time_units_en; word = word_en; } } setLang(locale); function concatWords(a, b) { if ((0, en_1.isEngChar)(a[a.length - 1]) || (0, en_1.isEngChar)(b[0])) { return a + ' ' + b; } return a + b; } function format_byte(n_byte, n_decimal = 2) { if (Number.isNaN(n_byte)) { return '-'; } let acc = n_byte; for (const size_unit of size_units) { if (acc < 1024) { return acc.toFixed(n_decimal) + ' ' + size_unit; } acc /= 1024; } return ((acc * 1024).toFixed(n_decimal) + ' ' + size_units[size_units.length - 1]); } function format_datetime(time, options = {}) { if (!time) { return options.empty || '-'; } const locales = options.locales || (0, locale_1.getEnvLocale)() || locale; let date; if (options.timezoneOffset !== undefined) { const date_ = (date = new timezone_date_ts_1.TimezoneDate(time)); date_.setTimezoneOffset(options.timezoneOffset); } else { date = new Date(time); } return date.toLocaleString(locales, { weekday: 'short', year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', hour12: true, minute: '2-digit', ...options, }); } const roundUnits = time_units_en.map(([unit]) => unit).sort((a, b) => b - a); function round_time_diff(timeDiff) { const absDiff = Math.abs(timeDiff); for (const unit of roundUnits) { if (absDiff > unit) { if (timeDiff > 0) { return Math.floor(timeDiff / unit) * unit; } else { return Math.ceil(timeDiff / unit) * unit; } } } return timeDiff; } function format_long_short_time(time, options) { // if within 1-week, format relative time, else format absolute time const diff = time - Date.now(); if (Math.abs(diff) < (options?.threshold || time_1.WEEK)) { return format_relative_time(diff, options?.format_duration_digit); } return format_datetime(time, options); } function format_time_duration(delta, digit = 1) { const diff = Math.abs(delta); if (!Number.isFinite(diff) || Number.isNaN(diff)) { return String(delta); } const res = (n, unit) => { const p = Math.pow(10, digit); n = Math.floor(n * p) / p; if (n > 1) { unit = (0, en_1.to_plural)(unit); } return n + ' ' + unit; }; for (const [size, unit] of time_units) { if (diff === size) { return '1 ' + unit; } if (diff > size) { return res(diff / size, unit); } } return word.instantly; } function format_relative_time(delta, digit = 1) { const s = format_time_duration(delta, digit); if (s === word.instantly) { return word['just now']; } if (delta > 0) { return concatWords(s, word.hence); } else { return concatWords(s, word.ago); } } /** * mainly for formatting month, date, hour, minute, and second * @param x: [0..60] * */ function format_2_digit(x) { if (x < 10) { return '0' + x; } return x.toString(); } /** * format: YYYYMMDD-HHMM * less accurate, for human reading * */ function format_time_code(time, separator = '-') { const t = new Date(time); const y = t.getFullYear(); const m = format_2_digit(t.getMonth() + 1); const d = format_2_digit(t.getDate()); const H = format_2_digit(t.getHours()); const M = format_2_digit(t.getMinutes()); return y + m + d + separator + H + M; } /** * format: YYYYMMDD-HHMM-SS-sss * more accurate, for filename * */ function format_timestamp_code(time, separator = '-') { const t = new Date(time); const y = t.getFullYear(); const m = format_2_digit(t.getMonth() + 1); const d = format_2_digit(t.getDate()); const H = format_2_digit(t.getHours()); const M = format_2_digit(t.getMinutes()); const S = format_2_digit(t.getSeconds()); const s = format_n_digit(t.getMilliseconds(), 3); return y + m + d + separator + H + M + separator + S + separator + s; } function format_n_digit(x, n, prefix = '0') { let s = Math.abs(x).toString(); if (x < 0) { n--; } if (s.length < n) { s = prefix.repeat(n - s.length) + s; } if (x < 0) { s = '-' + s; } return s; } function format_percentage(p, n_decimal = 2) { return Math.round(p * Math.pow(10, 2 + n_decimal)) / 100 + '%'; }