moment.js parseZone解析带+00:00偏移时间串的异常问题求助
问题:moment.js parseZone解析含UTC偏移的日期字符串出现异常
使用moment.js的parseZone函数解析带+00:00偏移的日期字符串时,出现了不符合预期的结果,相关代码及问题说明如下:
var a1 = 'Jan 24, 2024 12:43 +00:00'; var a = moment.parseZone(a1, 'MMM DD, YYYY hh:mm A Z'); console.log(">>>>> a: " + a.format()); // 输出不符合预期的2024-01-23T18:30:00Z var b1 = 'Jan 24, 2024 12:43'; var b = moment.parseZone(b1, 'MMM DD, YYYY hh:mm A'); console.log(">>>>> b: " + b.format()); // 输出符合预期的2024-01-24T12:43:00Z var c1 = "Jan 24, 2024 10:54 +00:00"; var c = moment.parseZone(c1, 'MMM DD, YYYY hh:mm Z') console.log(">>>>> c: " + c.format()); // 输出符合预期的2024-01-24T10:54:00Z
引入的moment.js版本:
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.30.1/moment.min.js"></script>
为什么变量a的结果不符合预期,但b和c的结果正常?
原因分析
- 格式字符串与原字符串的空格不匹配:
变量a的格式字符串MMM DD, YYYY hh:mm A Z中,YYYY后面有两个空格,但原字符串a1里2024后面只有一个空格。这种空格数量不匹配会导致moment的解析逻辑混乱,无法正确对应各个时间部分。 - 缺少AM/PM标识匹配:
格式字符串里使用了A(代表AM/PM时段标识),但原字符串a1的时间12:43没有对应的AM或PM。moment解析时会默认按AM处理,再结合空格不匹配的问题,最终导致解析出错误的日期时间。
为什么b和c正常?
- 变量
b:虽然格式字符串同样存在空格和A标识的不匹配,但因为没有时区偏移部分,moment的解析容错逻辑生效,最终得到正确结果。 - 变量
c:格式字符串的空格数量(YYYY后两个空格)和原字符串c1完全匹配,且格式里没有A标识,不需要AM/PM信息,因此解析逻辑正常,结果符合预期。
解决方法
通过调整字符串内容和格式字符串的匹配度,即可解决问题,修改后的代码如下:
// 给时间添加PM,匹配格式里的A标识 var a1 = 'Jan 24, 2024 12:43 PM +00:00'; // 移除YYYY后多余的空格,让格式与字符串空格一致 var a = moment.parseZone(a1, 'MMM DD, YYYY hh:mm A Z'); // 移除格式字符串里多余的空格 var b = moment.parseZone(b1, 'MMM DD, YYYY hh:mm'); // 移除格式字符串里多余的空格 var c = moment.parseZone(c1, 'MMM DD, YYYY hh:mm Z');
内容的提问来源于stack exchange,提问作者Jignesh Gohel
相关产品推荐
相关产品推荐

