Moment.js 两个时间diff计算结果与实际值不符问题求助
问题原因
- 核心问题由两个错误共同导致:
moment.duration用法错误:now.diff(start)默认返回两个时间的毫秒级差值,你给moment.duration传入第二个参数"hours",等于告知Moment你传入的数值单位为小时,会直接将毫秒值作为小时数计算,结果完全不符合预期。- 时区处理不符合需求:你的
start是强制转换为UTC模式的Moment对象,now是本地时区模式的Moment对象,二者时区基准不统一。你需要用本地时间计算差值的场景下,不需要手动给start调用utc()方法,Moment可以自动识别带Z后缀的ISO标准时间字符串,正确转换为本地时区的时间。 - 额外冗余写法:
moment(moment.now())属于没必要的嵌套写法,直接调用moment()就可以获取当前本地时间的Moment对象。
修复方案
根据你需要使用本地时间计算差值的需求,可任选以下两种正确写法:
写法1:直接通过diff获取小时差值
// 自动识别带Z的ISO时间串,转换为本地时区时间 let start = moment(startTime); // 直接获取当前本地时间的Moment对象 let now = moment(); // 第二个参数指定返回小时单位的差值,自动完成计算 let diffHours = now.diff(start, 'hours');
写法2:通过duration转换得到小时差值
let start = moment(startTime); let now = moment(); // diff返回毫秒差值,duration默认按毫秒处理,不需要额外传单位参数 let diff = moment.duration(now.diff(start)); // 转换为小时单位的数值 let diffHours = diff.asHours();
修改后你就可以得到正确的正数值1的结果,之前返回-2是因为时区偏移导致UTC模式下的start时间戳大于now的时间戳,叠加单位传参错误最终得到了异常的负数值。
内容的提问来源于stack exchange,提问作者Amir Jani
相关产品推荐
相关产品推荐

