【问题标题】:get user timezone [duplicate]获取用户时区 [重复]
【发布时间】:2011-06-12 09:17:58
【问题描述】:

可能重复:
How can I determine a web user's time zone?

最好的方法是什么? php 或 javascript。有人可以给我一些 sn-ps 吗?谢谢。

【问题讨论】:

    标签: php javascript timezone


    【解决方案1】:

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

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

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

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

    在同一页面上,在&lt;head&gt; 部分中,首先您需要包含 jQuery:

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

    同样在&lt;head&gt;部分,粘贴这个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) 或您所在的任何时区。

    您可以在我的blog 上阅读更多相关信息

    【讨论】:

    • 我收到一条错误消息,提示 $timezone 未定义。为什么?
    • 我认为这个解决方案从根本上是错误的(至少在某些情况下),因为它允许用户通过简单地调用domain.com/timezone.php 将时间更改为他想要的任何时间
    • @VladasDiržys 这是用户浏览器提供的信息。试图保护它免受用户攻击是没有意义的。
    • 这仅返回当前时区偏移量——而不是时区。见the timezone tag wiki
    • 使用$timezone 时要小心——攻击者可以将其设置为任何值。如果您在像"SELECT * FROM places WHERE timezone=$timezone" 这样的 SQL 查询中使用它,那么您将有一个 SQL 注入。如果你在你的 HTML 中 echo 它就像 echo "Your Timezone: $timezone" 一样,你将拥有一个 XSS。这是用户输入,请这样对待。
    【解决方案2】:

    在服务器端,它不会像 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...
    }
    

    【讨论】:

    • smart-ip.net 现在无法访问。所以这个解决方案是模糊的。我认为他们关闭了他们的服务器。因此,使用此代码需要您自担风险,因为 this 返回的结果为 null。
    • (-1) smart-ip.net/geoip-json/202.191.214.178 - 服务暂时不可用
    • 你现在可以试试这个网站:ip-api.com/json.
    • 我做了和以前一样的结果
    【解决方案3】:

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

    我自己也为此苦苦挣扎,并意识到偏移量是不够的。例如,它没有为您提供有关夏令时的任何信息。我最终编写了一些代码来映射到 zoneinfo 数据库键。

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

    在此处尝试脚本:http://jsfiddle.net/pellepim/CsNcf/

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

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

    【讨论】:

    • 这可能是最合理的方法了。
    猜你喜欢
    • 2013-03-27
    • 2017-03-23
    • 2018-03-13
    • 2016-10-12
    • 2011-10-19
    • 2012-01-02
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多