如何在MomentJS中获取UTC格式Date对象,避免toDate()转为本地时区
问题根因
你当前的代码本身存在逻辑错误:
moment.utc().format()输出的是UTC标准格式的时间字符串- 你再把这个字符串传入普通
moment()构造时,moment会默认按本地时区解析这个字符串,相当于直接把UTC的时间值套上了本地时区偏移,这才是你调用toDate()后时间不对的核心原因。
另外补充基础认知:原生JavaScript的Date对象本身存储的是UTC时间戳,你在控制台直接打印Date实例时,浏览器/运行环境会默认把它转换为本地时区的字符串展示,不代表它底层存储的时间是错的。
解决方案1:正确构造UTC时间的Date对象
如果你只需要Date对象存储的时间戳是UTC时间,不需要getFullYear()、getDate()等本地时区方法返回UTC对应数值,直接按下面的写法修正即可,这个方案完全满足ReactDatePicker的selected属性传参要求:
// 直接构造UTC模式的moment实例,不要多余的format再解析步骤 const date = moment.utc() // 得到的dateObj底层时间戳就是UTC时间 const dateObj = date.toDate() // 验证:输出的就是UTC时间字符串 console.log(dateObj.toISOString())
解决方案2:强制Date对象的本地方法返回UTC数值
如果你确实需要调用getFullYear()、getHours()这类按本地时区返回的方法时,得到的是UTC对应的数值,就需要手动抵消本地时区偏移:
const utcMoment = moment.utc() // 计算本地时区偏移的毫秒数 const offsetMs = utcMoment.utcOffset() * 60 * 1000 // 手动加回偏移量,抵消本地时区的转换 const dateObj = new Date(utcMoment.valueOf() + offsetMs) // 验证:比如UTC现在是2021-07-20 16:00:00,下面输出就是16,而不是本地时区的17 console.log(dateObj.getHours())
注意该方案得到的Date对象底层时间戳不是真实的UTC时间戳,仅适用于需要本地方法返回UTC数值的特殊场景。
内容的提问来源于stack exchange,提问作者ItzaMi
相关产品推荐
相关产品推荐

