我可以用什么方法在所有浏览器中获取时区缩写

what method can I use to get the timezone abbreviation in all browsers?

本文关键字:浏览器 获取 时区 缩写 什么 方法 我可以      更新时间:2023-09-26

在Chrome、Safari和Firefox中,我使用这样的调用:

var date = new Date();
date.toTimeString().match(/'((.*)')/)

但这在IE 9中不起作用,因为IE 9返回的数据没有括号。这在IE 11中不起作用,因为IE 11不返回缩写,而是返回类似(太平洋标准时间)的内容。

示例IE9-IE10输出:

"15:38:43 PST"

示例IE11和边缘输出:

"15:36:07 GMT-0800 (Pacific Standard Time)"

一些背景:

  • 时区名称及其缩写尚未正式标准化,尽管有许多方案已被广泛采用,可能被视为事实上的标准(例如IANA时区数据库)
  • 浏览器在国际化方面是出了名的糟糕,例如IE和Chrome将澳大利亚东部的时间报告为"东澳大利亚标准时间",而更广泛的说法是"澳大利亚东部标准时间"
  • 一些时区方案没有针对每个时区的唯一标识符,例如EST可能适用于3个不同的区域
  • toTimeString返回的值完全依赖于实现,因此它可能根本不包含任何时区信息,即使包含,也可能不是用户所期望的(请参阅上文)

有各种库可以根据Date.protype.getTimezoneOffset返回的时区偏移量确定可能的时区,并测试两个日期以查看是否使用夏令时(例如jsTimezoneDetect),但大多数库都基于IANA时区数据库。

因此,重新表述您的问题:

有没有可靠的方法来获取主机时区缩写

答案是否定的。

然而,如果您准备接受派生的IANA时区名称,并将其映射到您希望使用的任何其他方案,那么使用库将相当接近。

MomentJS时区:

moment.tz([2012, 0], 'America/New_York').format('z');    // EST
moment.tz([2012, 5], 'America/New_York').format('z');    // EDT
moment.tz([2012, 0], 'America/Los_Angeles').format('z'); // PST
moment.tz([2012, 5], 'America/Los_Angeles').format('z'); // PDT

尝试

Intl.DateTimeFormat().resolvedOptions().timeZone

Waring:它与所有浏览器版本不兼容