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结合使用?


4 回复

当然可以。node-ms 模块是一个用于时间单位转换的库,它提供了 shortlong 两种格式化时间的方法。让我们详细分析一下这段代码。

理解 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 模块中的 shortlong 函数分别用于将时间以不同的格式展示。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 函数能够提供更准确且自然的语言表达,使时间转换结果更易于理解。

回到顶部