回答

8

技术上,更正确的咒语是:

Intl.DateTimeFormat().resolvedOptions().timeZone 

不幸的是,并非所有的实现目前支持Intl API的时区功能。因此,虽然这将在Chrome中返回有效的IANA时区,但它在FireFox和其他几个浏览器中还不会这样做。

kangax Intl compatibility table将此功能显示为标记为resolvedOptions().timeZone defaults to the host environmentDateTimeFormat对象下的子项目。

请参见下面的Firefox浏览器项目:

  • Bug 1158733 - 从Javascript国际化API
  • Bug 895737检测系统时区 - DateTimeFormat不跟踪当前时区
  • Bug 837961 - 添加IANA时区支持国际化名称API

与此同时,有两种可行的替代方案s:

请注意,在尝试其他猜测算法之前,它们都将在内部尝试使用Intl API(如果它可用并且正常运行)。

另请注意,最佳做法是永不依赖时区检测/猜测,而是用它从时区选取器控件中选择合理的默认值。总是给用户一些选择他们想要的时区的方法。这一点非常重要,因为他们目前的计算机时区可能会或可能不是他们想要在您的应用程序中使用的时区。例如,基于网络的日历软件(例如Google日历或Outlook.com)通常允许用户在其用户配置文件中设置时区。

+0

当我尝试使用Firefox时,它不显示IANA代码,而是“Etc/+ 9GMT”。是否有可能获得IANA? –

+0

你确定这正是返回的?如果您在没有DST的UTC-9时区,则“Etc/GMT + 9”响应将成为有效的IANA时区。但是你写的字符没有顺序。 –

+0

对不起,我的错。它总是返回'Etc/GMT-9',而不是IANA代码'亚洲/首尔',如预期的那样。在Chrome 64位的Mac 61.0.3163.100和Safari中完美工作。只有Firefox它像这样返回。 (使用moment.tz.guess()或jstz.determine()..都返回那样) –