Moment.js设置默认时区后startOf('day')返回日期不一致问题
问题根因
你遇到的日期偏移问题核心是Moment.js的时区解析规则和默认输出规则的冲突,具体问题点如下:
moment.tz.setDefault()仅对无自带时区信息的新moment实例生效,不会修改系统原生时区,也不会覆盖传入参数自带的时区信息- 你在控制台看到的
Thu Oct 28 2021 00:00:00 GMT+0530 (India Standard Time)是moment实例调用toString()的默认输出,该输出会自动转成你系统本地的IST时区展示,并不代表这个moment实例本身用的是IST时区 - 当你把这个带IST时区标识的字符串/原生Date对象作为参数传入
moment(endDate)时,Moment会优先按照参数自带的IST时区解析,而非你设置的默认Pacific/Pago_Pago时区。Pacific/Pago_Pago为UTC-11,和IST(UTC+5:30)相差16.5小时,跨天之后自然会出现日期差1天的问题。
修复方案
- 传递参数时优先传时间戳而非字符串/原生Date,避免时区解析偏差:调用
moment().startOf('day').valueOf()传递数字时间戳即可 - 若必须传递日期对象/字符串,创建新moment实例时明确指定时区,覆盖解析规则:
moment.tz(endDate, 'Pacific/Pago_Pago').startOf('day')
- 调试时区问题时不要依赖默认toString输出,使用
format()方法按指定时区打印结果:moment().format()会输出你设置的默认时区的时间字符串,更准确。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

