iPhone端Chrome执行new Date解析日期返回Invalid date问题咨询
问题根因
- 受苹果应用商店的规则限制,iOS平台所有第三方浏览器(包括Chrome、Firefox、Edge等)都必须使用WebKit渲染引擎与JavaScriptCore JS引擎,和安卓、桌面端Chrome使用的Blink+V8内核实现完全不同,因此你在iPhone上的Chrome遇到的解析行为和iOS Safari完全一致,不是Chrome本身的实现差异。
- ECMAScript标准仅明确要求
Date构造函数必须支持符合ISO 8601扩展格式的日期字符串解析,标准格式要求日期段和时间段之间必须使用大写字符T作为分隔,完整格式为YYYY-MM-DDTHH:mm:ss.sssZ。 - 你传入的日期字符串
2022-07-04 15:29:00使用空格代替T分隔日期和时间,属于非标准格式:V8引擎(桌面端、安卓端Chrome/Edge、Node.js等环境使用)额外做了非标准兼容,可以正常识别这类格式;但JavaScriptCore引擎没有实现这层兼容,解析时直接返回Invalid Date。
兼容修复方案
- 方案1:将日期字符串中的空格替换为标准要求的
T,转成ISO 8601标准格式后再传入构造函数,该格式在所有JS引擎下都能稳定解析:
const date = new Date('2022-07-04 15:29:00'.replace(' ', 'T')); alert(date);
- 方案2:不依赖
Date的自动字符串解析能力,手动拆分日期、时间字段后传入构造函数,兼容性最好,注意Date构造函数的月份参数从0开始计数(即1月对应0,12月对应11):
const [dateSection, timeSection] = '2022-07-04 15:29:00'.split(' '); const [year, month, day] = dateSection.split('-').map(Number); const [hour, minute, second] = timeSection.split(':').map(Number); const date = new Date(year, month - 1, day, hour, minute, second); alert(date);
生产环境不要依赖非标准的日期字符串自动解析逻辑,这类未被标准覆盖的实现随时可能因为引擎版本变动出现兼容问题,优先使用标准ISO格式或手动拆分字段构造日期对象。
内容的提问来源于stack exchange,提问作者Ondřej Krajčík
相关产品推荐
相关产品推荐

