在 JavaScript 中获取客户端的时区(和偏移量)用getTimezoneOffset()

2022-08-29 22:16:12

如何收集访客的时区信息?

我需要两者:

  1. 时区(例如,欧洲/伦敦)
  2. 和 UTC 或 GMT 的偏移量(例如,UTC+01)

答案 1

使用偏移量计算时区是一种错误的方法,并且始终会遇到问题。时区和夏令时规则可能会在一年中多次更改,并且很难跟上变化。

要在 JavaScript 中获取系统的 IANA 时区,您应该使用

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

截至2022年4月,这适用于全球使用的93.5%的浏览器

旧的兼容性信息

ecma-402/1.0 表示,如果未提供给构造函数,则可能是未定义的。但是,未来的草案 (3.0) 通过更改为系统默认时区来修复该问题。timeZone

在此版本的 ECMAScript Internationalization API 中,如果在提供给 Intl.DateTimeFormat 构造函数的选项对象中未提供时区属性,则 timeZone 属性将保持未定义状态。但是,应用程序不应依赖此,因为将来的版本可能会返回一个 String 值,以标识主机环境的当前时区。

在 ecma-402/3.0 中,它仍然在草案中,它更改为

在此版本的 ECMAScript 2015 国际化 API 中,如果在提供给构造函数的选项对象中未提供任何属性,则该属性将是默认时区的名称。在这种情况下,以前的版本未定义该属性。timeZonetimeZoneIntl.DateTimeFormattimeZone


答案 2

getTimezoneOffset()

您可以在几分钟内获得时区偏移量,如下所示:

var offset = new Date().getTimezoneOffset();
console.log(offset);
// if offset equals -60 then the time zone offset is UTC+01

时区偏移量是 UTC 与本地时间之间的差值(以分钟为单位)。请注意,这意味着如果本地时区位于 UTC 之后,则偏移量为正,如果位于 UTC 之前,则偏移量为负。例如,如果您的时区是 UTC+10(澳大利亚东部标准时间),则将返回 -600。夏令时可防止此值成为常量,即使对于给定的区域设置也是如此

请注意,并非所有时区都偏移整小时:例如,纽芬兰是 UTC 减去 3h 30m(将夏令时排除在等式之外)。

另请注意,这只给你时区偏移量(例如:UTC+ 01),它不会给你时区(例如:欧洲/伦敦)。