测试JSFiddle代码时IE 11显示无效日期,Chrome/Firefox显示正常求助
解决IE11中日期解析显示“无效日期”的问题
我太懂这种跨浏览器日期兼容性的坑了!IE11的Date对象对日期字符串的解析规则比Chrome、Firefox严格得多,你遇到的问题就是因为它不识别'07/15/2014 05:00:00.0'这种带.0后缀的时间格式。
问题重现的代码
var data = [ { name: 'A', date: '07/15/2014 05:00:00.0',des:'This is for A' }, { name: 'A', date: '08/16/2016 06:00:00.0',des:'This is for 2A' }, { name: 'A', date: '07/15/2015 07:00:00.0',des:'This is for 3A' }, { name: 'B', date: '07/15/2016 07:00:00.0',des:'This is for B' }, { name: 'B', date: '08/16/2016 07:00:00.0',des:'This is for 2B' } ]; // 尝试在IE11中解析会得到Invalid Date data.forEach(item => { console.log(new Date(item.date)); });
核心原因
现代浏览器(Chrome、Firefox)会自动忽略时间部分末尾多余的.0,但IE11会把这个后缀当成无效的时间格式,直接返回Invalid Date。这是因为早期ECMAScript标准没有统一日期字符串的解析规则,不同浏览器厂商实现差异很大。
几种可行的解决方案
方案1:移除时间末尾的.0后缀
用正则表达式把日期字符串里的.0去掉,转换成IE11能识别的格式:
data.forEach(item => { // 替换掉时间末尾的.0 const compatibleDateStr = item.date.replace(/\.0$/, ''); const validDate = new Date(compatibleDateStr); console.log(validDate); // 现在IE11能正常解析了 });
方案2:手动拆分日期时间并构造Date对象
如果担心还有其他格式兼容性问题,可以手动拆分年、月、日、时、分、秒,直接用Date的构造函数参数来创建:
function parseDate(dateStr) { // 拆分日期和时间部分 const [datePart, timePart] = dateStr.split(' '); // 拆分月、日、年 const [month, day, year] = datePart.split('/').map(Number); // 拆分时、分、秒(忽略.0) const [hours, minutes, seconds] = timePart.split(':').map(part => Number(part.split('.')[0])); // 注意:Date构造函数的月份是0-11,所以要减1 return new Date(year, month - 1, day, hours, minutes, seconds); } data.forEach(item => { const validDate = parseDate(item.date); console.log(validDate); });
方案3:使用日期处理库(如Moment.js)
如果你的项目已经在使用日期库,直接用库的解析方法会更省心,比如Moment.js:
data.forEach(item => { const validDate = moment(item.date, 'MM/DD/YYYY HH:mm:ss.S').toDate(); console.log(validDate); });
(不过如果只是解决这一个问题,前面两种原生方案更轻量,不需要引入额外库)
验证建议
修改后可以直接在IE11的开发者工具控制台里测试,确认每个日期都能正常显示为有效的Date对象,而不是Invalid Date。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

