从浏览器获取客户端时区
五年后,我们有一个内置的方法!对于现代浏览器,我会使用:
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);
这将返回 IANA 时区字符串,但不返回偏移量。在MDN 参考 中了解更多信息。
兼容性表- 截至 2019 年 3 月,适用于全球 90% 的浏览器。不适用于 Internet Explorer。
看看这个存储库pageloom它是有帮助的
下载 jstz.min.js 并向您的 html 页面添加一个函数
<script language="javascript">
function getTimezoneName() {
timezone = jstz.determine()
return timezone.name();
}
</script>
并从您的显示标签调用此函数
通常当人们寻找“时区”时,只需要“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 是一个更现代、更小的替代方案。)
目前,最好的选择可能是mbayloon's answer 中建议的jstz。
为了完整起见,应该提到它的方式有一个标准:Intl。您已经可以在 Chrome 中看到这一点:
> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
(这实际上并不遵循标准,这是坚持使用库的另一个原因)
您可以使用moment-timezone来猜测时区:
> moment.tz.guess()
"America/Asuncion"