获取用户时区

IT技术 php javascript timezone
2021-01-21 16:05:14

可能重复:
如何确定网络用户的时区?

哪种方法最好?php 或 javascript。有人能给我提供一些片段吗?谢谢。

3个回答

这将为您提供时区作为 PHP 变量。我使用 jQuery 和 PHP 编写了一个函数。这是经过测试的,确实有效!

在您希望将时区作为变量的 PHP 页面上,将这段代码放在页面顶部附近的某处:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

这将读取我们现在将要创建的会话变量“time”。

在同一页面上的<head>部分中,首先您需要包含 jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

同样在该<head>部分,粘贴此 jQuery:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://example.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

您可能注意到也可能没有注意到,但您需要将 url 更改为您的实际域。

最后一件事。您可能想知道 timezone.php 到底是什么。嗯,就是这样:(创建一个名为timezone.php的新文件,并用上面的 url 指向它)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

如果这工作正常,它将首先加载页面,执行 JavaScript,然后重新加载页面。然后,您将能够读取 $timezone 变量并随意使用它!它返回当前的 UTC/GMT 时区偏移量 (GMT -7) 或您所在的任何时区。

您可以在我的博客上阅读有关此内容的更多信息

我收到一个错误,说 $timezone 未定义。为什么?
2021-03-26 16:05:14
我认为这个解决方案从根本上是错误的(至少在某些情况下),因为它允许用户通过简单地调用domain.com/timezone.php来改变时间,为他想要的任何东西
2021-03-29 16:05:14
这仅返回当前时区偏移量 - 而不是时区请参阅时区标签维基
2021-04-03 16:05:14
使用时要小心$timezone- 攻击者可以将其设置为任何内容。如果你在 SQL 查询中使用它,"SELECT * FROM places WHERE timezone=$timezone"那么你将有一个 SQL 注入。如果你echo在你的 HTML 中使用它echo "Your Timezone: $timezone",你将有一个 XSS。这是用户输入,请如此对待。
2021-04-04 16:05:14
@VladasDiržys 这是用户浏览器提供的信息。试图针对用户保护它是毫无意义的。
2021-04-08 16:05:14

在服务器端,它不会像 JavaScript 那样准确。同时,有时需要解决此类任务。只是为了在这种情况下分享可能的解决方案,我写了这个答案。

如果您需要确定用户的时区,可以通过 Geo-IP 服务完成。其中一些提供时区。例如,这个(http://smart-ip.net/geoip-api)可以帮助:

<?php
$ip     = $_SERVER['REMOTE_ADDR']; // means we got user's IP address 
$json   = file_get_contents( 'http://smart-ip.net/geoip-json/' . $ip); // this one service we gonna use to obtain timezone by IP
// maybe it's good to add some checks (if/else you've got an answer and if json could be decoded, etc.)
$ipData = json_decode( $json, true);

if ($ipData['timezone']) {
    $tz = new DateTimeZone( $ipData['timezone']);
    $now = new DateTime( 'now', $tz); // DateTime object corellated to user's timezone
} else {
   // we can't determine a timezone - do something else...
}
我做了和以前一样的结果
2021-03-24 16:05:14
现在无法访问smart-ip.net所以这个解决方案是模糊的。我认为他们关闭了服务器。因此,使用此代码需要您自担风险,因为由此返回的结果为空。
2021-03-26 16:05:14
(-1) smart-ip.net/geoip-json/202.191.214.178 - 服务暂时不可用
2021-03-30 16:05:14
你现在可以试试这个网站:ip-api.com/json
2021-03-31 16:05:14

正如奥德所回答的那样。您需要在 javascript 中具有这种检测功能。

我自己一直在努力解决这个问题,并意识到偏移量是不够的。例如,它不会为您提供有关夏令时的任何信息。我最终编写了一些代码来映射到 zoneinfo 数据库键。

通过检查一年左右的多个日期,您可以更准确地确定时区。

试试这里的脚本:http : //jsfiddle.net/pelepim/CsNcf/

只需更改您的系统时区,然后单击运行即可进行测试。如果您正在运行 chrome,您需要在新选项卡中进行每个测试(并且需要重新启动 safar 以获取时区更改)。

如果您想了解代码的更多详细信息,请查看:https : //bitbucket.org/pellepim/jstimezonedetect/

这可能是最合理的方法。
2021-03-25 16:05:14