Moment JS日期异常问题咨询:为何日期从10月21日变为17日?
解析Moment对象日期从2018-10-21变成2018-10-17的原因
这个问题的核心是解析格式与输入字符串的UTC偏移量格式不匹配,导致Moment.js解析日期时出现了错误。我们先拆解你给出的Moment对象关键属性:
_i: 你传入的原始日期字符串:"2018-10-21T01:00:00+01:00"(东一区的10月21日1点)_f: 你指定的解析格式:"YYYY-MM-DDTHH:mm:ssZ"_d: 最终解析出的UTC日期:2018-10-17T00:00:00.000Z
为什么会出错?
Moment.js的格式符有严格的对应规则:
- 单个
Z格式符用于解析不带冒号的UTC偏移量(比如+0100或者Z) - 两个
ZZ格式符才用于解析带冒号的UTC偏移量(比如+01:00或者Z)
你传入的字符串偏移量是+01:00(带冒号),但指定的格式用了单个Z,Moment无法正确识别这个偏移量部分,进而导致整个日期字符串的解析逻辑混乱,最终输出了错误的10月17日。
怎么解决?
有两种简单的修复方式:
- 修正解析格式:把格式字符串改成
"YYYY-MM-DDTHH:mm:ssZZ"(用两个Z),这样Moment就能正确识别带冒号的偏移量:const momentObj = moment("2018-10-21T01:00:00+01:00", "YYYY-MM-DDTHH:mm:ssZZ"); - 不指定解析格式:Moment.js可以自动识别ISO 8601标准的日期字符串,所以直接传入原始字符串即可,不需要手动指定格式:
const momentObj = moment("2018-10-21T01:00:00+01:00");
用这两种方式解析后,得到的UTC日期应该是2018-10-20T23:00:00.000Z,转换为东一区时间就是你原本期望的2018-10-21T01:00:00。
内容的提问来源于stack exchange,提问作者skyz
相关产品推荐
相关产品推荐

