使用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()
,因此它继承自环境。我的右手时刻是从没有秒的字符串中解析出来的。我不确定这些信息的相关性,这就是为什么我把它从原来的问题中删除了。
答案 0 :(得分:3)
自定义时刻显示相对时间的方式的正式方法是使用relativeTimeRounding
和relativeTimeThreshold
(以及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)。
这是一个实时样本:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
&#13;
{{1}}&#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