解决方案:

我们可以尝试使用客户端JavaScript来获取时区,然后使用Ajax或者其他方式将其提交到服务器。

Javascript是获取客户端本地时间的最简单方法。我建议使用XMLHttpRequest发送回本地时间,如果失败,请根据其IP地址返回检测到的时区。

另一个选择是从用户代理的国家/地区偏好推断时区。这是一种粗略的方法(不适用于美国),但是可以很好地近似。

-new Date().getTimezoneOffset()/60;

getTimezoneOffset()方法将从GMT中减去时间,并返回分钟数。因此,如果我们居住的是GMT-8,它将返回480。

要将其乘以小时数,请除以60。此外,请注意,该符号与我们所需要的相反,它是计算GMT与我们所在时区的偏移量,而不是我们所在时区与GMT之间的偏移量。要解决此问题,只需乘以-1.

另请注意,w3school说:

The returned value is not a constant, because of the practice of using
  Daylight Saving Time.

简而言之,所描述的方法依赖于JavaScript的getTimezoneOffset函数,该函数返回保存在会话cookie中的值,并供后台代码在GMT和本地时间之间调整时间值。令人高兴的是,用户不需要指定时区(代码会自动指定时区)。

使用PHP date函数,我们将获得站点所在服务器的日期时间。
获得用户时间的唯一方法是使用JavaScript。

我们可以使用PHP函数date_default_timezone_set设置任何特定的时区。这为用户设置了指定的时区。

基本上,用户时区位于客户端,因此我们必须使用JavaScript。

以下是使用PHP和JavaScript获取用户时区的脚本。

<?php
#http://www.php.net/manual/en/timezones.php List of Time Zones
function showclienttime()
{
  if(!isset($_COOKIE['GMT_bias']))
  {
    ?>
    <script type="text/javascript">
    var Cookies = {};
    Cookies.create = function (name, value, days) {
      if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
      } else {
        var expires = "";
      }
      document.cookie = name + "=" + value + expires + "; path=/";
      this[name] = value;
    }

    var now = new Date();
    Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
    window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
    </script>
    <?php
  } else {
    $fct_clientbias = $_COOKIE['GMT_bias'];
  }

  $fct_servertimedata = gettimeofday();
  $fct_servertime = $fct_servertimedata['sec'];
  $fct_serverbias = $fct_servertimedata['minuteswest'];
  $fct_totalbias = $fct_serverbias C $fct_clientbias;
  $fct_totalbias = $fct_totalbias * 60;
  $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
  $fct_time = time();
  $fct_year = strftime("%Y", $fct_clienttimestamp);
  $fct_month = strftime("%B", $fct_clienttimestamp);
  $fct_day = strftime("%d", $fct_clienttimestamp);
  $fct_hour = strftime("%I", $fct_clienttimestamp);
  $fct_minute = strftime("%M", $fct_clienttimestamp);
  $fct_second = strftime("%S", $fct_clienttimestamp);
  $fct_am_pm = strftime("%p", $fct_clienttimestamp);
  echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
}

showclienttime();
?>
如何确定web用户所在的时区

Web服务器有没有办法知道用户所有的社区?

日期:2020-03-23 10:21:15 来源:oir作者:oir