为什么moment-timezone的utcOffset方法返回错误的UTC偏移结果
问题现象
部分时区下调用utcOffset方法的返回结果,和moment()实例的计算结果存在偏差。以Europe/Belgrade时区为例,该时区当前执行夏令时为GMT+2,异常复现代码如下:
`Now: ${currentMoment.format()}` // Now: 2022-06-09T12:12:08+03:00 moment.tz.zone("Europe/Belgrade").utcOffset(moment().unix()) // 返回-60,对应偏移1小时,结果错误 moment.tz("Europe/Belgrade").format() // 2022-06-09T11:07:03+02:00,结果正确
根因分析
异常由参数单位不匹配导致:
moment.tz.zone(<时区名>).utcOffset()方法要求传入的时间戳参数为毫秒级Unix时间戳,但示例中传入的moment().unix()返回值是秒级Unix时间戳,传入后会定位到1970年附近的错误时间点,最终返回错误的时区偏移值。- 直接通过
moment.tz("Europe/Belgrade")生成实例时,库内部自动完成了时间单位的适配转换,因此可以得到正确的偏移计算结果。
修复方式
将传入的时间戳替换为毫秒级即可得到正确结果,两种常用实现:
// 方式1:调用moment原生方法取毫秒级时间戳 moment.tz.zone("Europe/Belgrade").utcOffset(moment().valueOf()) // 返回-120,对应GMT+2偏移,结果正确 // 方式2:手动将秒级时间戳转换为毫秒级 moment.tz.zone("Europe/Belgrade").utcOffset(moment().unix() * 1000) // 返回-120,对应GMT+2偏移,结果正确
补充说明:
utcOffset方法的返回值符号和常规时区偏移认知相反:返回负值代表东时区正向偏移,返回正值代表西时区负向偏移,单位为分钟,因此GMT+2对应返回-120属于符合设计的正常结果。
内容的提问来源于stack exchange,提问作者Andrey Khataev
相关产品推荐
相关产品推荐

