从浏览器获取客户端时区

con*_*ius 125 javascript browser timezone http

有没有可靠的方法从客户端浏览器获取时区?我看到了以下链接,但我想要一个更强大的解决方案.

使用JavaScript自动检测时区

JavaScript中的时区检测

Wal*_*ace 146

五年后,我们有了内置的方式!对于现代浏览器,我会使用:

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);
Run Code Online (Sandbox Code Playgroud)

它可能不适用于您需要支持的浏览器,如果是这种情况,我会回到之前答案中提供的库之一.

不适用于firefox(51及以下)和IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions#Browser_compatibility

  • `Intl.DateTimeFormat().resolvedOptions().timeZone`将从Firefox 52开始返回预期值:http://kangax.github.io/compat-table/esintl/#test-DateTimeFormat_resolvedOptions().timeZone_defaults_to_the_host_environment (5认同)
  • 在firefox中不起作用:`Intl.DateTimeFormat().resolvedOptions().timeZone` - >`undefined` (4认同)
  • 现在可以在Firefox中使用 (4认同)
  • Firefox和IE浏览器似乎不支持属性:( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions#Browser_compatibility (3认同)
  • 我相信*不*提供抵消是长期规划的最佳政策。如果客户端需要提供偏移量,那么他们还需要更新 IANA 时区数据库,不仅包括当时可用的时区字符串集,还包括当时的时区字符串的偏移量时间点。最好依靠服务器端代码来解析时区字符串,以便根据请求发生时的时间点的 tzdata 正确偏移,而不是依赖于浏览器的最新状态。 (2认同)

Geo*_*zen 84

看看这个存储库pageloom它是有帮助的

下载jstz.min.js并在你的html页面中添加一个函数

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>
Run Code Online (Sandbox Code Playgroud)

并从您的显示标签调用此功能

  • TL; DR我们现在可以使用Wallace建议的`Intl.DateTimeFormat().resolvedOptions().timeZone`(无IE11). (10认同)

Chr*_* W. 71

通常当人们在寻找"时区"时,只需"UTC偏移"即可.例如,他们的服务器是UTC + 5,他们想知道他们的客户端是以UTC-8运行的.


在普通的旧javascript (new Date()).getTimezoneOffset()/60中将返回当前偏离UTC的小时数.

值得注意的是getTimezoneOffset()返回值的符号中可能出现的"陷阱" (来自MDN文档):

时区偏移是UTC与本地时间之间的差异(以分钟为单位).请注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果前置,则偏移量为负.例如,对于时区UTC + 10:00(澳大利亚东部标准时间,符拉迪沃斯托克时间,查莫罗标准时间),将返回-600.


但是,我建议您将moment.js用于与时间/日期相关的Javascript代码.在这种情况下,您可以通过运行以下方式获得ISO 8601格式的UTC偏移:

> dayjs().format("Z")
"-08:00"
Run Code Online (Sandbox Code Playgroud)

(可能会提到客户端可以轻易伪造此信息.)

  • 值得注意的是,偏移和时区不一定是一回事. (24认同)
  • 如何仅使用偏移量应用DST?在这些地区,偏差是半年错误的.IMO时区更准确. (6认同)
  • DST是任何给定时间的偏移的一部分.中欧冬季时间为UTC + 01:00.但是,当应用DST时,CET是UTC + 02:00,就像我现在在丹麦一样. (4认同)
  • 考虑夏令时时,偏移量不准确。 (2认同)
  • 我会将第一句话改为:“通常,当人们认为偏移量就足够时,他们实际需要的是时区。前者完全忽略夏令时,而后者则不然。” (2认同)

Joh*_*off 45

目前,最好的选择可能是mbayloon的回答中建议的jstz.

为了完整起见,应该提到它有一个标准:Intl.你可以在Chrome中看到这个:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
Run Code Online (Sandbox Code Playgroud)

(这实际上并不遵循标准,这是坚持使用库的另一个原因)

  • 仅供参考 - 标准现在是Intl.DateTimeFormat().resolvedOptions().timeZone (19认同)
  • 如果在构造`DateTimeFormat`时没有手动指定时区,则@MichaelCole的`Intl`的_Conformant_实现应该为`timeZone`属性返回`undefined`.Chrome通过返回系统的时区而偏离标准; 这就是约翰内斯的答案所利用的,也是为什么他说"实际上并没有遵循标准". (2认同)

Tom*_*cek 7

您可以使用moment-timezone来猜测时区:

> moment.tz.guess()
"America/Asuncion"
Run Code Online (Sandbox Code Playgroud)

  • 虽然该库在 2020 年仍然非常有用,但 [moment 已被弃用](https://momentjs.com/docs/),并且不应该在新项目中使用。 (2认同)