如何从格式为"2018-04-24 11:56:27+0000"的UTC字符串创建兼容多浏览器的Date对象?
解决UTC时间字符串兼容IE的Date对象创建问题
这个问题确实挺常见的——现代浏览器对这种带+0000的UTC时间格式支持不错,但IE的Date构造函数对非标准ISO格式的兼容性一直比较差。这里有两个可靠的方案,能帮你在所有目标浏览器里正确创建Date对象:
方案1:转换为IE支持的标准ISO 8601格式
IE(包括最新版IE11)能够正确解析标准的ISO 8601格式字符串,比如YYYY-MM-DDTHH:mm:ssZ(其中T是日期和时间的分隔符,Z代表UTC时区)。我们只需要对原字符串做简单替换:
const originalUtcStr = "2018-04-24 11:56:27+0000"; // 把空格替换为T,+0000替换为Z const ieCompatibleStr = originalUtcStr.replace(' ', 'T').replace('+0000', 'Z'); const localDate = new Date(ieCompatibleStr);
这个方法简单高效,适合IE9及以上版本,而且现代浏览器也完全兼容这种格式。
方案2:手动解析时间组件(兼容性最强)
如果需要兼容更老的IE版本(比如IE8),或者想完全避免浏览器对字符串解析的差异,手动拆分时间的各个部分是最稳妥的方式。我们可以通过正则或字符串拆分提取年、月、日、时、分、秒,然后用Date.UTC()构建UTC时间戳,再转成本地时间的Date对象:
const originalUtcStr = "2018-04-24 11:56:27+0000"; // 用分隔符拆分字符串,得到各个时间部分 const timeParts = originalUtcStr.split(/[- :+]/); // 注意:Date对象的月份是从0开始的(0=1月,11=12月) const year = parseInt(timeParts[0], 10); const month = parseInt(timeParts[1], 10) - 1; const day = parseInt(timeParts[2], 10); const hours = parseInt(timeParts[3], 10); const minutes = parseInt(timeParts[4], 10); const seconds = parseInt(timeParts[5], 10); // 先创建UTC时间的时间戳,再转成本地时间的Date对象 const localDate = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
这种方法完全不依赖浏览器的字符串解析逻辑,兼容性覆盖所有你提到的浏览器,包括老版本IE。
为什么原格式IE不支持?
Chrome、Firefox等现代浏览器实现了更宽松的时间字符串解析逻辑,能够识别空格分隔日期时间、+0000这种时区标识;但IE的Date构造函数仅严格支持标准ISO 8601格式或特定的本地时间格式,所以直接用原字符串会导致IE无法正确解析。
内容的提问来源于stack exchange,提问作者bpoiss
相关产品推荐
相关产品推荐

