momentjs如何格式化时间差值

本文介绍如何使用moment.js库准确计算两个时间之间的差值,并解决由于时区问题导致的计算误差。文章提供了几种不同的解决方案,包括使用MomentTimezone、数据提取等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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. 时区划分参考
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值