Edge浏览器中的日期解析问题导致无效日期错误
Edge浏览器中的日期解析问题导致无效日期错误
嗨,这个问题我之前排查过类似的情况,核心原因其实是不同浏览器对toLocaleString()的输出格式没有统一标准,导致moment无法正确解析Edge返回的日期字符串,最终抛出无效日期的错误,进而让页面崩溃。
咱们来拆解一下问题:
- 你在代码里先用
new Date().toLocaleString()把日期转成了本地化字符串,再传给moment去解析。但toLocaleString()的输出完全依赖浏览器的本地化设置和版本:Chrome返回的格式可能是"8/23/2024, 3:45:22 PM",而Edge(尤其是旧版Edge)可能返回带不同分隔符、时区标识或者顺序的字符串,比如"23/08/2024 15:45:22"或者带额外字符的格式。 - moment对这类非标准的本地化字符串兼容性很差,没办法正确识别所有浏览器的输出格式,自然就会解析出
Invalid Date,后续用到这个日期的地方就会报错,导致页面崩溃。
那怎么解决呢?其实完全可以绕开本地化字符串这一步,直接用moment处理原生Date对象或者时间戳,这样就彻底避免了浏览器差异:
优化后的代码示例
// 直接用moment获取当前时间,无需转本地化字符串 const startTime = moment().utc().format('MM-DD-YYYY HH:mm:ss.SSS'); const currentResponse = await commonAPI.apiname(); // 请求结束后再获取结束时间 const endTime = moment().utc().format('MM-DD-YYYY HH:mm:ss.SSS'); const pStat = { PageID: '4', MethodID: 60, StartTime: startTime, EndTime: endTime, ParameterValues: '', ParameterJson: '', }; await commonAPI.InsertPS(pStat);
额外注意点
你原来的代码里用了Ms作为毫秒的格式符,这是个小错误——moment里表示毫秒的正确格式符是SSS(三位毫秒数),如果写Ms会把M和s当成普通字符输出,导致日期格式不符合预期,这一点也要修正哦。
备注:内容来源于stack exchange,提问作者Lex V
相关产品推荐
相关产品推荐

