momentjs如何格式化时间差值

在实际应用中,我们经常需要计算两个时间的差值,用来确定消逝的时间,如下:

var m1 = moment('2017-12-18 10:00:20'),
    m2 = moment('2017-12-18 10:10:00'),
    du = moment.duration(m2 - m1, 'ms');
//  输出结果为“10 分钟”
console.log(du.locale('zh-cn').humanize())

在要求精确的环境中,比如要精确到秒,并且能提供秒递增的动画功能,此时“humanize()”就显得力不从心,但duration又没有提供moment的“format”方法,怎么办呢?

初步的想法是将moment.duration对象转换为moment对象,然后再利用“format”方法进行转换,但是结果却多了8小时,如下:

var m1 = moment('2017-12-18 10:00:20'),
    m2 = moment('2017-12-18 10:10:00'),
    du = moment(m2 - m1).format('HH时mm分ss秒');
//  输出结果为08时09分40秒
console.log(du);

8小时,很容易就让我们想到是时区的问题,可以通过如下方式进行验证:

du = moment(m2 - m1).format('HH时mm分ss秒 ZZ');
//  输出结果为08时09分40秒 +0800
console.log(du)

粗暴的方式是直接减去8小时的数据,优雅的方式是引入Moment Timezone,如下:

//  Africa/Abidjan为+00:00时区
//  输出结果00时09分40秒
du = moment.tz(m2 - m1, "Africa/Abidjan").format('HH时mm分ss秒')

当然,还有其他的方式,比如采用数据提取方式,如下:

var du = moment.duration(m2 - m1, 'ms'),
    hours = du.get('hours'),
    mins = du.get('minutes'),
    ss = du.get('seconds');
//  依旧可以达到同样的效果
console.log(hours + '时' + mins + '分' + ss + '秒');

为什么moment对象支持加减法操作

我们知道,javascript是不支持操作重载的,那moment是怎么实现的?其实所有的操作都依赖于valueOf()方法,所以支持加减法操作很简单,只需要提供valueOf方法即可,如下:

function Time(time) {
    this.time = time;
}
Time.prototype.valueOf = function() {
    return this.time;
}
var t1 = new Time(1000),
    t2 = new Time(2000);
//  输出-1000
alert(t1 - t2);

参考文档

  1. 时区划分参考
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值