如何在IE 11浏览器中获取当前时区?
解决IE11下获取浏览器时区的问题
别发愁,IE11对现代JS API的支持确实不太友好,咱们一步步来搞定这个问题:
为什么你的现有方案失效?
Intl.DateTimeFormat().resolvedOptions().timeZone:IE11完全不支持resolvedOptions()这个方法,所以直接调用肯定会报错。moment.tz().zoneName():大概率是你没正确配置moment-timezone的时区数据,或者版本兼容性没匹配好导致的。
方案一:无需额外库,通过Date对象提取时区(适合轻量场景)
IE11的Date.toString()输出里会包含时区信息,咱们可以通过正则提取:
function getBrowserTimeZone() { // 优先适配现代浏览器 if (typeof Intl !== 'undefined' && Intl.DateTimeFormat && typeof Intl.DateTimeFormat.prototype.resolvedOptions === 'function') { return Intl.DateTimeFormat().resolvedOptions().timeZone; } // IE11兼容逻辑 const dateString = new Date().toString(); // 匹配括号内的时区名称,比如"(中国标准时间)" const tzMatch = dateString.match(/\(([^)]+)\)/); if (tzMatch && tzMatch[1]) { return tzMatch[1]; } // 如果名称提取失败,退而返回GMT偏移格式 const offsetMinutes = new Date().getTimezoneOffset(); const sign = offsetMinutes < 0 ? '+' : '-'; const hours = Math.floor(Math.abs(offsetMinutes) / 60).toString().padStart(2, '0'); const minutes = (Math.abs(offsetMinutes) % 60).toString().padStart(2, '0'); return `GMT${sign}${hours}${minutes}`; } // 使用示例 console.log(getBrowserTimeZone());
⚠️ 注意:这个方法依赖Date.toString()的输出格式,不同语言环境下可能有差异,如果你的网站是多语言场景,可能需要额外适配。
方案二:正确使用moment-timezone(更可靠的方案)
如果你的项目已经在用moment,补全moment-timezone的配置就能解决问题:
- 确保引入兼容IE11的版本(比如moment@2.29.4、moment-timezone@0.5.43)
- 加载时区数据(可以直接引入包含时区数据的moment-timezone脚本,或者手动添加)
- 用
moment.tz.guess()获取标准时区ID:
// 引入脚本后直接使用 const detectedTimeZone = moment.tz.guess(); console.log(detectedTimeZone); // 输出类似"Asia/Shanghai" // 如果需要友好的时区名称 const timeZoneName = moment.tz(detectedTimeZone).format('z'); console.log(timeZoneName); // 输出类似"CST"
这个方法兼容性更强,还能拿到标准的IANA时区ID,适合需要精准时区处理的场景。
内容的提问来源于stack exchange,提问作者Shwetha Pichhi
相关产品推荐
相关产品推荐

