Moment.js处理带时区时间时无法正确获取时分及AM/PM问题求助
解决Moment.js解析带时区时间字符串的问题
嘿,我来帮你搞定这个问题!你的核心问题在于解析时间时指定的格式和实际字符串格式不匹配,而且没处理时区信息,导致Moment解析出错了。
先看你的输入时间字符串:2018-04-26T08:19:30+02:00,这是标准的ISO 8601格式,包含了日期、时间和时区偏移(+02:00表示比UTC早2小时)。但你用moment(el.time,'HH:mm a')去解析,相当于告诉Moment“这个字符串只有12小时制的时分”,这完全和实际格式不搭,Moment只能猜着解析,结果自然不对。
正确的处理方法
你需要先让Moment正确识别这个带时区的ISO字符串,然后提取你需要的时间部分:
方案1:直接解析ISO格式(推荐)
Moment原生支持ISO 8601格式,不需要手动指定解析格式,直接解析后格式化即可:
// 正确解析带时区的时间,输出24小时制的08:19 let momentDay = moment(el.time).format('HH:mm'); // 如果需要12小时制带AM/PM,就用这个格式 // let momentDay = moment(el.time).format('hh:mm a');
这样会得到原时区里的08:19(或者08:19 AM),因为Moment会保留字符串里的时区信息进行解析。
方案2:指定完整的解析格式(更严谨)
如果你想明确指定解析格式,对应你的输入字符串,应该用:
let momentDay = moment(el.time, 'YYYY-MM-DDTHH:mm:ssZ').format('HH:mm');
这里的Z用来匹配时区偏移部分(+02:00),确保解析完全准确。
为什么原来的代码会得到20:19 p?
当你用HH:mm a作为解析格式时,Moment会把输入字符串的前几位强行匹配成12小时制时间——比如它可能把2018当成小时(显然不符合逻辑),再加上错误的时区转换,最终输出了完全偏离预期的时间结果。
内容的提问来源于stack exchange,提问作者Joan
相关产品推荐
相关产品推荐

