Chrome 67 Beta中Date().toString()时区字符串异常变更问题咨询
解决Chrome 67+中Date.toString()时区显示过长的问题
嘿,这个时区显示的变化确实挺闹心的,尤其是在屏幕寸土寸金的移动设备上!我给你几个实用的解决思路,帮你找回熟悉的3字母时区代码:
1. 从toTimeString()中提取3字母时区
Chrome 67虽然改了toString()的输出,但toTimeString()依然保留了带3字母时区的格式(比如"15:20:45 GMT+0100 (BST)")。你可以用正则轻松提取出括号里的缩写:
const getShortTimezone = () => { const timeStr = new Date().toTimeString(); const timezoneMatch = timeStr.match(/\(([A-Z]{3})\)/); return timezoneMatch ? timezoneMatch[1] : 'Unknown'; }; // 调用示例 console.log(getShortTimezone()); // 输出类似 BST、GMT 这样的3字母代码
2. 用Intl API自定义紧凑时间格式
如果你的需求是在页面上展示时间而非依赖toString()的输出,推荐用现代的Intl.DateTimeFormat API,它能直接指定显示短时区名称,而且适配性更好:
const compactTimeWithTimezone = new Intl.DateTimeFormat('en-GB', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', timeZoneName: 'short' // 关键:指定显示短时区代码 }).format(new Date()); console.log(compactTimeWithTimezone); // 输出类似 "14/05/2024, 15:25 BST"
这个方法不仅能满足小屏幕的紧凑显示,还能根据用户的语言区域自动调整格式,体验更友好。
3. 兼容新旧版本的 fallback 方案
如果你需要同时适配Chrome 66及更早版本,可以加个版本判断,针对不同版本用不同的提取逻辑:
// 先获取Chrome版本号 const getChromeVersion = () => { const versionMatch = navigator.userAgent.match(/Chrome\/(\d+)/); return versionMatch ? parseInt(versionMatch[1], 10) : null; }; const getShortTimezone = () => { const chromeVersion = getChromeVersion(); if (chromeVersion && chromeVersion >= 67) { // 新版处理逻辑 const timezoneMatch = new Date().toTimeString().match(/\(([A-Z]{3})\)/); return timezoneMatch ? timezoneMatch[1] : ''; } else { // 旧版直接从toString提取 const timezoneMatch = new Date().toString().match(/([A-Z]{3}) \(/); return timezoneMatch ? timezoneMatch[1] : ''; } };
小提醒
虽然3字母时区代码存在不唯一的问题(比如IST对应多个时区),但如果你的目标用户集中在特定区域,这个方案完全够用。要是面向全球用户,可能需要结合完整时区信息,但在移动设备的紧凑显示场景下,3字母代码依然是性价比很高的选择。
内容的提问来源于stack exchange,提问作者Steve Brooker




