从浏览器获取客户端时区

IT技术 javascript http browser timezone
2021-02-07 16:10:55

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

使用 JavaScript 自动检测时区

JavaScript 中的时区检测

6个回答

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

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

这将返回 IANA 时区字符串,但不返回偏移量MDN 参考 中了解更多信息

兼容性表- 截至 2019 年 3 月,适用于全球 90% 的浏览器。不适用于 Internet Explorer

如何使用 this is a form?developer.mozilla.org/en-US/docs/Web/HTML/Element/input /...建议的隐藏值中
2021-03-24 16:10:55
现在可以在 Firefox 中使用
2021-03-24 16:10:55
我相信提供补偿是长期规划的最佳策略。如果客户端需要提供偏移量,则它们还需要与 IANA 时区数据库保持最新,不仅是当时可用的时区字符串集,还包括那些时区字符串的偏移量时间点。最好依靠服务器端代码来解析时区字符串以根据请求发生时的 tzdata 正确偏移,而不是依赖于浏览器的最新状态。
2021-03-24 16:10:55
Intl.DateTimeFormat().resolvedOptions().timeZone将返回从 Firefox 52 开始的预期值:kangax.github.io/compat-table/esintl/...
2021-03-27 16:10:55
Firefox 和 IE 似乎不支持该属性:( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-30 16:10:55

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

下载 jstz.min.js 并向您的 html 页面添加一个函数

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

并从您的显示标签调用此函数

TL;DR 我们现在可以Intl.DateTimeFormat().resolvedOptions().timeZone按照 Wallace 的建议使用(没有 IE11)。
2021-03-20 16:10:55

通常当人们寻找“时区”时,只需要“UTC 偏移量”就足够了。例如,他们的服务器在 UTC+5 并且他们想知道他们的客户端在 UTC-8 中运行


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

值得注意的是,getTimezoneOffset()返回值的符号中可能存在“陷阱” (来自 MDN 文档)

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


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

> dayjs().format("Z")
"-08:00"

值得一提的是,客户很容易伪造这些信息。

(注意:这个答案最初推荐https://momentjs.com/,但 dayjs 是一个更现代、更小的替代方案。)

我会把第一句话改成:“通常,当人们认为偏移量足够时,他们实际上需要的是一个时区。前者完全忽略夏令时,而后者则没有。”
2021-03-17 16:10:55
可能值得注意的是,偏移量和时区不一定是一回事。
2021-03-18 16:10:55
考虑夏令时,偏移量不准确。
2021-03-23 16:10:55
您将如何仅使用偏移量应用 DST?在这些地区,偏移量有半年是错误的。IMO 时区更准确。
2021-04-02 16:10:55
DST 是任何给定时间偏移量的一部分。冬季的中欧时间是 UTC+01:00。但是,当应用 DST 时,CET 是 UTC+02:00,就像现在在我所在的丹麦一样。
2021-04-06 16:10:55

目前,最好的选择可能是mbayloon's answer 中建议的jstz

为了完整起见,应该提到它的方式有一个标准:Intl您已经可以在 Chrome 中看到这一点:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"

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

@MichaelCole符合性的实现Intl都应该返回undefinedtimeZone财产,如果你没有手动指定在构建一个时区DateTimeFormatChrome 通过返回系统的时区来偏离标准;这就是约翰内斯的回答所利用的,也是他说“实际上并不遵循标准”的原因。
2021-04-03 16:10:55
仅供参考 - 标准现在是 Intl.DateTimeFormat().resolvedOptions().timeZone
2021-04-09 16:10:55
Intl 在除 Safari 之外的所有方面看起来都很稳定。 caniuse.com/#feat=国际化
2021-04-11 16:10:55

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

> moment.tz.guess()
"America/Asuncion"
虽然该库在 2020 年仍然非常有用,但moment 已被弃用,不应用于新项目。
2021-04-05 16:10:55