ms源码 🔗
ms是一个用于毫秒时间格式化的工具,可以在语义化的时间格式和毫秒之间进行转换。
源码地址 🔗
vercel/ms: Tiny millisecond conversion utility (github.com)
Usage 🔗
语义化时间转毫秒
1
2
3
| ms('2 days') // 172800000
ms('1d') // 86400000
ms('10h') // 36000000
|
毫秒转语义化时间
1
2
3
4
5
| ms(60000) // "1m"
ms(2 * 60000) // "2m"
// longFormat
ms(60000, { long: true }) // "1 minute"
ms(2 * 60000, { long: true }) // "2 minutes"
|
源码 🔗
入口函数传入2个参数,第1个就是需要转换的值,第2个是配置参数
1
2
3
4
5
6
7
8
9
10
11
12
13
| function(val, options) {
options = options || {};
var type = typeof val;
if (type === 'string' && val.length > 0) {
return parse(val);
} else if (type === 'number' && isFinite(val)) {
return options.long ? fmtLong(val) : fmtShort(val);
}
throw new Error(
'val is not a non-empty string or a valid number. val=' +
JSON.stringify(val)
);
};
|
- 如果第1个参数是
string
, 走parse
方法 - 如果是
number
, 走format
方法
parse 🔗
parse中通过正则表达式把传入的语义化的参数进行分割
1
| var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
|
目的就是把语义化的字符串中的数字和单位进行分割
正则表达式进行图形化分析
最后把拿到的数值和 单位对应的毫秒进行相乘
1
2
3
4
5
6
| var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;
|
这里还要注意一下
一个地球年其实是365.25
天, 好吧,之前都没有注意过这个问题
fmtShort 🔗
对于的输入毫秒数, 输入语义化的字符串
1
2
| ms(60000) // "1m"
ms(2 * 60000) // "2m"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| function fmtShort(ms) {
var msAbs = Math.abs(ms);
if (msAbs >= d) {
return Math.round(ms / d) + 'd';
}
if (msAbs >= h) {
return Math.round(ms / h) + 'h';
}
if (msAbs >= m) {
return Math.round(ms / m) + 'm';
}
if (msAbs >= s) {
return Math.round(ms / s) + 's';
}
return ms + 'ms';
}
|
- 对传入的值进行取绝对值
- 取值后和单位毫秒数进行比对,如果大于某个单位,就会取输入值和单位毫秒数的商,最后进行四舍五入
fmtLong 🔗
对于的输入毫秒数, 输入语义化的字符串,只不过最后的单位会是完整的字符串,如果是大于1的,单位自动增加复数
1
2
| ms(60000, { long: true }) // "1 minute"
ms(2 * 60000, { long: true }) // "2 minutes"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| function fmtLong(ms) {
var msAbs = Math.abs(ms);
if (msAbs >= d) {
return plural(ms, msAbs, d, 'day');
}
if (msAbs >= h) {
return plural(ms, msAbs, h, 'hour');
}
if (msAbs >= m) {
return plural(ms, msAbs, m, 'minute');
}
if (msAbs >= s) {
return plural(ms, msAbs, s, 'second');
}
return ms + ' ms';
}
/**
* Pluralization helper.
*/
function plural(ms, msAbs, n, name) {
var isPlural = msAbs >= n * 1.5;
return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
}
|
plural
中 msAbs >= n * 1.5
这里的n 要乘以 1.5, 是为了处理Math.round
的四舍五入的后的值
比如ms的值是1.2个n, 四舍五入后就是1, 自然单位就不用以复数的形式输出, 加s了