Nodejs node-ms模块
Nodejs node-ms模块
看了一下ms模块的源码发现有一段不是很理解,求指点
var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;
function short(ms) {
if (ms >= d) return Math.round(ms / d) + 'd';
if (ms >= h) return Math.round(ms / h) + 'h';
if (ms >= m) return Math.round(ms / m) + 'm';
if (ms >= s) return Math.round(ms / s) + 's';
return ms + 'ms';
}
/**
* Long format for `ms`.
*
* [@param](/user/param) {Number} ms
* [@return](/user/return) {String}
* [@api](/user/api) private
*/
function long(ms) {
return plural(ms, d, 'day')
|| plural(ms, h, 'hour')
|| plural(ms, m, 'minute')
|| plural(ms, s, 'second')
|| ms + ' ms';
}
/**
* Pluralization helper.
*/
function plural(ms, n, name) {
if (ms < n) return;
if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
return Math.ceil(ms / n) + ' ' + name + 's';
}
这是部分源码,用于将long和short类型的时间的转换方法
为什么short直接了当的用了round四舍五入 而long写的这么麻烦,plural辅助方法,不就是用于四舍五入吗,为什么不直接用round,而是采用floor和ceil结合使用?
当然可以。node-ms
模块是一个用于时间单位转换的库,它提供了 short
和 long
两种格式化时间的方法。让我们详细分析一下这段代码。
理解 short
方法
short
方法的主要目的是将给定的毫秒数转换为最合适的单位(天、小时、分钟、秒或毫秒),并返回一个简短的字符串表示。
var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;
function short(ms) {
if (ms >= d) return Math.round(ms / d) + 'd';
if (ms >= h) return Math.round(ms / h) + 'h';
if (ms >= m) return Math.round(ms / m) + 'm';
if (ms >= s) return Math.round(ms / s) + 's';
return ms + 'ms';
}
在这个方法中,Math.round
用于四舍五入。例如,如果你传入 86400000
毫秒(即一天),Math.round(86400000 / 86400000)
将返回 1
,所以输出结果是 1d
。
理解 long
方法
long
方法则更复杂一些,因为它提供了更详细的格式化输出,包括复数形式的单位名称(如 “day” 或 “days”)。
function long(ms) {
return plural(ms, d, 'day')
|| plural(ms, h, 'hour')
|| plural(ms, m, 'minute')
|| plural(ms, s, 'second')
|| ms + ' ms';
}
/**
* Pluralization helper.
*/
function plural(ms, n, name) {
if (ms < n) return;
if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
return Math.ceil(ms / n) + ' ' + name + 's';
}
为什么使用 plural
辅助方法?
plural
方法的主要目的是处理单位的复数形式。具体来说:
Math.floor
:如果时间小于n * 1.5
,但大于等于n
,则使用Math.floor
来确保结果是整数,并且避免出现小数。Math.ceil
:如果时间大于n * 1.5
,则使用Math.ceil
来向上取整,并添加复数形式的单位名称。
例如:
- 如果输入
179999
毫秒(约等于 2 天 - 1 秒),plural(179999, d, 'day')
返回1 day
。 - 如果输入
2629746
毫秒(约等于 30 天),plural(2629746, d, 'day')
返回30 days
。
示例代码
假设我们有一个函数来测试这些方法:
const ms = require('ms');
console.log(ms.short(86400000)); // 输出: 1d
console.log(ms.long(86400000)); // 输出: 1 day
console.log(ms.long(2629746000)); // 输出: 30 days
总结
short
方法简单地使用Math.round
进行四舍五入,以便提供简洁的时间单位表示。long
方法通过plural
辅助方法来处理更复杂的单位复数形式,确保输出既准确又具有可读性。
为了加表示复数的 ‘s’
这里的复数是一种语法表现形式
node-ms
模块中的 short
和 long
函数分别用于将时间以不同的格式展示。short
函数通过简单的四舍五入来快速得到一个较为简洁的时间表示,而 long
函数则更加注重于表达时间的准确性,通过使用 plural
辅助函数来决定何时使用 floor
(向下取整)或 ceil
(向上取整),以确保时间表示更符合自然语言习惯。
示例代码
const ms = require('ms');
// 使用 short 函数
console.log(ms(10500)); // 输出 "11s"
// 使用 long 函数
console.log(ms(10500, { long: true })); // 输出 "11 seconds"
解释
-
short 函数:简单地将时间转换为最接近的大单位(如天、小时等),并进行四舍五入。
-
long 函数:更细致地处理时间单位转换,确保输出符合自然语言的习惯。例如,当时间接近但略大于某个单位时(如 1.4 小时),
plural
函数会使用ceil
来将其显示为 2 小时,而不是 1 小时。如果时间略小于某个单位(如 0.6 小时),则使用floor
来显示为 0 小时。
通过这种方式,long
函数能够提供更准确且自然的语言表达,使时间转换结果更易于理解。