Moment.js使用utc和startOf获取当日零点时跨午夜时区偏移问题
Moment获取UTC当日零点问题解答
两种写法的区别
moment().utc().startOf('day').valueOf():先创建本地时区的当前时间实例,再将实例时区切换为UTC,最后取UTC时间当日零点的时间戳moment.utc().startOf('day').valueOf():直接创建UTC时区的当前时间实例,再取UTC时间当日零点的时间戳
二者返回结果完全一致,后者省去了一次时区转换步骤,性能略好,更推荐使用。
正偏移时区午夜时段取值错误解决方案
问题本质
你之前的写法逻辑是以当前UTC时间的日期为准,取对应日期的UTC零点,而你实际需要的是以当前本地时间的日期为准,取对应日期的UTC零点。当你处于UTC+1这类正偏移时区,本地已经进入新一天但UTC还未到新一天的时段,二者的日期不一致,就会出现返回前一天UTC零点的问题。
符合要求的实现(必须使用utc()和startOf('day'))
写法1:显式设置日期
// 获取本地当前时间实例提取年月日 const localNow = moment() const targetUtcZeroTimestamp = moment.utc() .set('year', localNow.year()) .set('month', localNow.month()) .set('date', localNow.date()) .startOf('day') .valueOf()
写法2:传入本地日期字符串(更简洁)
const targetUtcZeroTimestamp = moment.utc(moment().format('YYYY-MM-DD')).startOf('day').valueOf()
场景验证
对应你给出的测试场景:本地时间为2021-11-24T00:21:52+01:00,UTC时间为2021-11-23T23:21:52+00:00
上述两种写法最终都会得到UTC时间2021-11-24T00:00:00+00:00对应的时间戳,符合需求。
内容的提问来源于stack exchange,提问作者Angelotti
相关产品推荐
相关产品推荐

