如何检测用户的时区?

2022-08-30 13:55:05

我需要根据我的用户当前所处的IP或http标头了解他们的时区。

关于这个问题,我得到了很多答案,但我无法理解这些答案。有人说使用(从这里)。但这意味着什么呢?-new Date().getTimezoneOffset()/60

我的(索引.php)页面的根目录中有一个。因此,为此,我必须动态获取时区并将其设置为.date_default_timezone_set("Asia/Calcutta");Asia/Calcutta


答案 1

总结一下 Matt Johnson 在代码方面的答案:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //For e.g.:"Asia/Kolkata" for the Indian Time.
    $.post("url-to-function-that-handles-time-zone", {tz: timezone}, function(data) {
       //Preocess the timezone in the controller function and get
       //the confirmation value here. On success, refresh the page.
     });
  });
</script>

答案 2

浏览器的时区信息不是HTTP规范的一部分,因此您不能仅从标头中获取它。

如果您有位置坐标(例如,来自移动设备GPS),则可以使用以下方法之一查找时区。但是,按IP地址进行地理定位并不是一个很好的解决方案,因为通常IP是ISP或代理服务器的IP,这些服务器可能位于另一个时区。

您可以使用一些策略来尝试检测时区,例如使用jsTimeZoneDetect库,这是一个很好的起点,但不够完美,你不能仅仅依靠它。如果您使用的是 moment.js,那么 moment-timezone 中有一个名为“时刻时区”的内置函数,可以执行相同的操作。moment.tz.guess()

使用JavaScript函数的想法是有缺陷的,因为你没有得到一个时区 - 只是一个特定日期的单个偏移量。请参阅时区标签 wiki 的标题为“时区 != 偏移量”的部分。getTimezoneOffset()

无论你如何看待它,最终你必须决定以下两种方法之一:

  • 仅以 UTC 格式向浏览器发送时间,并在浏览器上使用 JavaScript 转换为用户可能将其计算机设置为的任何本地时区。

在这个答案中更详细地讨论了这个问题(从c#的角度来看)。