Web 服务器是否有一种标准方法可以在网页中确定用户的时区?
也许来自 HTTP 标头或user-agent
字符串的一部分?
Web 服务器是否有一种标准方法可以在网页中确定用户的时区?
也许来自 HTTP 标头或user-agent
字符串的一部分?
-new Date().getTimezoneOffset()/60;
该方法getTimezoneOffset()
将从 GMT 中减去您的时间并返回分钟数。所以如果你住在 GMT-8,它会返回 480。
要将其转换为小时,请除以 60。另外,请注意该符号与您需要的符号相反 - 它正在计算 GMT 与您的时区的偏移量,而不是您的时区与 GMT 的偏移量。要解决这个问题,只需乘以 -1。
还要注意w3school说:
由于使用夏令时的做法,返回值不是常量。
我见过的最流行的(==标准?)确定时区的方法就是简单地询问用户自己。如果您的网站需要订阅,这可以保存在用户的个人资料数据中。对于匿名用户,日期可以显示为 UTC 或 GMT 等。
我不是想成为一个聪明的人。只是有时某些问题在任何编程上下文之外都有更好的解决方案。
到目前为止,还没有 HTTP 标头会报告客户端时区,尽管有人建议将其包含在 HTTP 规范中。
如果是我,我可能会尝试使用客户端 JavaScript 获取时区,然后使用 Ajax 或其他方式将其提交给服务器。
首先,了解 JavaScript 中的时区检测是不完美的。您可以使用对象实例获取特定日期和时间的本地时区偏移量,但这与完整的IANA 时区(如.getTimezoneOffset
Date
America/Los_Angeles
有一些选项可以工作:
const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tzid);
结果是一个字符串,其中包含运行代码的计算机的 IANA 时区设置。
支持的环境在国际兼容性表中列出。展开该DateTimeFormat
部分,然后查看名为 的功能resolvedOptions().timeZone defaults to the host environment
。
一些库(例如Luxon)使用此 API 通过诸如luxon.Settings.defaultZoneName
.
如果您需要支持更广泛的环境,例如较旧的 Web 浏览器,您可以使用库对时区进行有根据的猜测。Intl
如果 API 可用,他们首先尝试API,当 API 不可用时,他们询问对象的getTimezoneOffset
功能Date
,针对几个不同的时间点,使用结果从内部数据集中选择合适的时区。
无论jsTimezoneDetect和时刻,时区具有此功能。
// using jsTimeZoneDetect
var tzid = jstz.determine().name();
// using moment-timezone
var tzid = moment.tz.guess();
在这两种情况下,结果只能被认为是一种猜测。在许多情况下,猜测可能是正确的,但不是所有情况。
此外,这些库必须定期更新,以抵消许多较旧的 JavaScript 实现只知道其本地时区的当前夏令时规则的事实。 更多细节在这里。
最终,更好的方法是实际询问您的用户他们的时区。提供他们可以更改的设置。您可以使用上述选项之一来选择默认设置,但不要让您的应用程序无法偏离默认设置。
还有一种完全不同的方法,即完全不依赖于用户计算机的时区设置。相反,如果您可以收集纬度和经度坐标,则可以使用以下方法之一将它们解析为时区。这在移动设备上运行良好。
JavaScript 是获取客户端本地时间的最简单方法。我建议使用XMLHttpRequest发回本地时间,如果失败,则退回到根据其 IP 地址检测到的时区。
至于地理定位,我已经在几个项目中使用了MaxMind GeoIP,它运行良好,但我不确定它们是否提供时区数据。这是一项您付费的服务,他们每月为您的数据库提供更新。他们提供多种网络语言的包装器。