确定用户的时区

时间:2020-03-05 18:37:13  来源:igfitidea点击:

Web服务器是否可以通过某种标准方法来确定网页中用户的时区?

也许来自HTTP标头或者部分用户代理字符串?

解决方案:

到目前为止,还没有HTTP标头可以报告客户端时区,尽管建议将其包含在HTTP规范中。

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

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

至于地理位置,我已经在多个项目中使用了MaxMind GeoIP,并且效果很好,尽管我不确定它们是否提供时区数据。这是一项我们需要付费的服务,并且它们每月都会对数据库进行更新。他们提供几种Web语言的包装器。

确定我所看到的时区的最流行(==标准?)方法只是问用户自己。如果网站需要订阅,则可以将其保存在用户的个人资料数据中。对于匿名用户,日期可以显示为UTC或者GMT或者类似的日期。

我并不是想成为聪明人。只是有时候某些问题在任何编程环境之外都有更好的## 解决方案。

魔术似乎都在

visitortime.getTimezoneOffset()

太酷了,我对此一无所知。可以在IE等系统中使用吗?
从那里,我们应该能够使用JS来进行Ajax,设置cookie等等。我可能自己走饼干路线。

不过,我们需要允许用户对其进行更改。我们尝试使用地理定位(通过maxmind)来进行此操作,并且经常发生错误,以至于不值得这样做,因此我们只是让用户在自己的个人资料中进行设置,并向避风港的用户显示通知还没有设置他们的。

Anyone know of any services that will
  match IP to geographic location

好吧,很幸运我们可以在我们自己的stackoverflow网站上找到答案:
如何根据某个IP获得国家/地区?

剧透:http://www.hostip.info/use.html

如果我们恰巧使用OpenID进行身份验证,则简单注册扩展将为已身份验证的用户解决问题(我们需要将tz转换为数字)。

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

-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.

这是一篇带有源代码的文章,它解释了如何确定和使用ASP.NET(VB.NET,C#)应用程序中的本地化时间:

是时候了

简而言之,所描述的方法依赖于JavaScript的getTimezoneOffset函数,该函数返回保存在会话cookie中的值,并供后台代码在GMT和本地时间之间调整时间值。令人高兴的是,用户不需要指定时区(代码会自动指定时区)。涉及的内容更多(这就是我链接到本文的原因),但是提供的代码确实使它易于使用。我怀疑我们可以将逻辑转换为PHP和其他语言(只要我们了解ASP.NET)。

使用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();
?>

但是按照我的观点,最好向用户询问在项目中是否必须注册。