使用moment-timezone转换Unix时间戳返回错误结果的技术问询
问题排查与解决
我来帮你分析下问题所在,以及怎么修复:
问题根源
moment.unix(1516812300) 默认会把时间戳解析为你当前运行环境的本地时区的时间,而不是UTC时间。当你后续调用 .tz('Asia/Kolkata') 时,它是把本地时区的时间转换到印度时区,而不是把时间戳对应的UTC时间转换到印度时区——这就是为什么你得到了错误的22:15而不是预期的16:45。
修复方案
有两种可靠的方式解决这个问题:
方案1:直接用moment.tz.unix()在指定时区解析时间戳
moment-timezone提供了直接在目标时区解析Unix时间戳的方法,完全不受本地时区影响:
let moment = require('moment-timezone'); let date = moment.tz.unix(1516812300, 'Asia/Kolkata').format('YYYY-MM-DD HH:mm:ss'); // 输出:2018-01-24 16:45:00
方案2:先解析为UTC时间,再转换到目标时区
如果你更习惯先处理UTC时间,也可以先把时间戳解析成UTC moment对象,再转换到印度时区:
let moment = require('moment-timezone'); let date = moment.unix(1516812300).utc().tz('Asia/Kolkata').format('YYYY-MM-DD HH:mm:ss'); // 输出:2018-01-24 16:45:00
额外提示
你原来的格式字符串'YYYY-M-DD-H-mm-s'会生成单数字的月份、秒(比如1而不是01),如果想要统一两位数的规范格式,可以调整为'YYYY-MM-DD HH:mm:ss'。
内容的提问来源于stack exchange,提问作者shamon shamsudeen




