解决方案:
我们可以尝试使用客户端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服务器有没有办法知道用户所有的社区?
日期:2020-03-23 10:21:15 来源:oir作者:oir