是否可以编辑Moment#的粒度以输出?

时间:2017-02-28 15:54:00

标签: javascript momentjs

使用MomentJS的Moment#to方法,有什么办法可以控制输出吗?

var opens = moment('Tue 8:00:00am', 'ddd h:mm:ssa')

var now1 = moment('Tue 7:43:30am', 'ddd h:mm:ssa')
console.log(now1.to(opens))  // in 17 minutes

var now2 = moment('Tue 7:43:31am', 'ddd h:mm:ssa')
console.log(now2.to(opens))  // in 16 minutes
<script src="https://unpkg.com/moment@2.17.1/min/moment.min.js"></script>

我希望now2.to(opens)在比较时忽略秒数,因此它会在“17分钟内”返回。

我觉得这是不可能的,因为moment docs没有列出任何适用的参数。

Moment#isBefore和朋友们使用第二个可选参数来限制比较的粒度(例如,Moment#isBefore(otherMoment, 'minute')会在比较时忽略秒和毫秒。

编辑:我的最终目标是在分钟更改时仅更改“在N分钟内”消息,而不是在31秒。

在我上面的例子中,当源时刻为30时,我在“17分钟内”,在31分钟时“16分钟内”。

编辑2:在我的应用程序中,我的左手时刻取自moment(),因此它继承自环境。我的右手时刻是从没有秒的字符串中解析出来的。我不确定这些信息的相关性,这就是为什么我把它从原来的问题中删除了。

2 个答案:

答案 0 :(得分:3)

自定义时刻显示相对时间的方式的正式方法是使用relativeTimeRoundingrelativeTimeThreshold(以及moment.updateLocale Math.floor密钥(如果需要)。

在您的情况下,要获得所需的输出,您可以将舍入功能设置为Math.round(默认var opens = moment('Tue 8:00:00am', 'ddd h:mm:ssa'); var now1 = moment('Tue 7:43:30am', 'ddd h:mm:ssa'); var now2 = moment('Tue 7:43:31am', 'ddd h:mm:ssa'); var now3 = moment('Tue 7:44:01am', 'ddd h:mm:ssa'); console.log(now1.to(opens)); // in 17 minutes console.log(now2.to(opens)); // in 16 minutes console.log(now3.to(opens)); // in 16 minutes // Change relative time rounding moment.relativeTimeRounding(Math.floor); // Set 1 minute = 60 seconds (default 45) moment.relativeTimeThreshold('s', 60); console.log(now1.to(opens)); // in 16 minutes console.log(now2.to(opens)); // in 16 minutes console.log(now3.to(opens)); // in 15 minutes)并将第二个阈值设置为60(默认为45)。

这是一个实时样本:

&#13;
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
&#13;
{{1}}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以通过更改转换解析器来实现此目的。如果您没有传递秒信息,.to方法将不会考虑它们。

var opens = moment('Tue 8:00:00am', 'ddd h:mm')

var now1 = moment('Tue 7:43:30am', 'ddd h:mm')
console.log(now1.to(opens))  // in 17 minutes

var now2 = moment('Tue 7:43:31am', 'ddd h:mm')
console.log(now2.to(opens))  // in 17 minutes