JS字符串08-24-2021转Date在Chrome正常但Firefox、Safari失败如何修复
问题根因
- 你用到的
08-24-2021属于MM-DD-YYYY格式的非标准日期字符串,ECMAScript规范没有要求浏览器统一支持这种格式的日期解析,不同浏览器的实现规则有差异:Chrome做了兼容解析,Firefox和Safari默认不支持该格式,所以返回Invalid Date - 不带格式参数直接调用
moment(日期字符串)时,moment内部会优先调用浏览器原生的Date解析逻辑,所以同样会出现解析失败的问题
解决方案
方案1:原生JS手动解析(无第三方依赖)
把日期字符串按分隔符拆分,手动传入年、月、日参数构造Date对象即可,注意JS的Date月份从0开始计数,所以月份参数需要减1:
const dateStr = cartData.configuration.pickDate; const [month, day, year] = dateStr.split('-').map(Number); const validDate = new Date(year, month - 1, day);
该方案全浏览器兼容,不需要额外引入依赖。
方案2:moment.js指定格式解析
调用moment时明确传入和日期字符串匹配的格式参数MM-DD-YYYY,即可实现正确解析:
const validMomentDate = moment(cartData.configuration.pickDate, 'MM-DD-YYYY');
解析后可正常调用moment的各类API,也可以用validMomentDate.toDate()转为原生Date对象使用。
方案3:数据源层面优化(长期最优)
如果可以修改后端/数据源返回的日期格式,建议统一返回ISO 8601标准格式的日期字符串,比如2021-08-24,所有浏览器和日期处理库都能直接解析该格式,不需要额外适配处理。
内容的提问来源于stack exchange,提问作者margherita pizza
相关产品推荐
相关产品推荐

