【问题标题】:Get user timezone string with Javascript / PHP?使用 Javascript / PHP 获取用户时区字符串?
【发布时间】:2013-02-24 10:44:58
【问题描述】:

我正在尝试在 singup 上将用户的时区作为字符串获取。示例:

$timezone = "Asia/Tel_Aviv";

在研究这个问题时,我知道了如何Get timezone offset with Javascript,但我仍然不清楚如何将时区偏移量转换为php中的时区字符串,如上所示? p>

或者,我在 Javascript/PHP 中使用哪种其他方法来获取每个用户的时区字符串?

我真的不知道如何处理这个问题。

【问题讨论】:

  • 您无法真正获得用户的时区,因为 PHP 是一种服务器端语言。您需要先使用 javascript 获取它,然后将其发送到您的服务器
  • 同意 - 你不能单独在 PHP 中做到这一点。您的服务器没有将该信息作为标头获取。
  • 一个简单的方法是让javascript将它设置在cookie中,然后你可以在PHP中获取cookie。

标签: php timezone


【解决方案1】:

您不能仅在 PHP 中执行此操作。

您可以使用 Javascript 设置 cookie 中的值,然后使用 PHP 在下一页读取 cookie(重新)加载。

Javascript:

var dateVar = new Date()
var offset = dateVar.getTimezoneOffset();
document.cookie = "offset="+offset;

PHP:

echo $_COOKIE['offset'];

使用它来将偏移量转换为 PHP 中的友好时区名称。 Javascript 以分钟为单位返回偏移量,而这个 PHP 函数期望输入以秒为单位 - 所以乘以 60。第三个参数是一个布尔值,表示您是否处于夏令时。阅读手册并更新代码以满足您的需求。

echo timezone_name_from_abbr("", intval($_COOKIE['offset'])*60, 0);

http://php.net/manual/en/function.timezone-name-from-abbr.php

【讨论】:

  • 但正如 deceze 所写,这无助于我生成一个可靠的时区,或者会吗?也许坚持使用时区字符串并不重要?
  • @Roy 这次我想我明白了。
【解决方案2】:
  1. 您无法从偏移量中获取时区名称。那是因为在任何给定时间有许多时区具有相同的偏移量,因此您不能根据偏移量选择一个。 (如果你这样做了,当时区进入或退出 DST 时,这会咬你一口,改变偏移量。
  2. 最好的办法是通过 IP 地址进行地理定位(谷歌搜索,那里有很多资料)作为最好的初步猜测,然后让用户自己选择他的时区。李>

【讨论】:

    【解决方案3】:
    function tzone(){
        if(isset($_SESSION["tz"])){ $return = $_SESSION["tz"]; } else {
            $ip = $_SERVER["REMOTE_ADDR"];
            $getip = file_get_contents("http://freegeoip.net/json/$ip");
            $getip = json_decode($getip);
            $lat = $getip->latitude; $lng = $getip->longitude; $country = $getip->country_name;
            $getzone = file_get_contents("http://api.geonames.org/timezoneJSON?lat=$lat&lng=$lng&username=demo"); //you can change "demo" to your own username. its free service
            $getzone = json_decode($getzone);
            $zone = $getzone->timezoneId;
            $_SESSION["tz"] = $zone;
            $return = $_SESSION["tz"];
        }
        return $return;
    }
    

    【讨论】:

      【解决方案4】:

      您需要部分遵循Nicholas Pickeringdeceze♦ 的答案。不要使用PHP的timezone_name_from_abbr函数(Ref)。

      按照以下步骤获取用户系统中设置的任何时区UTC时间

      1. Javascript(客户端):

        var dateVar = new Date();
        var offset = dateVar.getTimezoneOffset();
        //getTimezoneOffset - returns the timezone difference between UTC and Local Time
        document.cookie = "offset="+offset;
        
      2. PHP(服务器端):

        public function convert_utc_time($date)
        {
            $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
            if($time_difference != ''){
                $time = strtotime($date);
                $time = $time + ($time_difference*60); //minutes * 60 seconds
                $date = date("Y-m-d H:i:s", $time);
            } //on failure of js, default timezone is set as UTC below
            return $date;
        }
        ..
        ..
        //in my function
        $timezone = 'UTC';
        $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
        echo strtotime($date. ' '. $timezone)
        

      【讨论】:

        猜你喜欢
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 2013-11-22
        • 2011-08-21
        • 1970-01-01
        • 2018-11-02
        相关资源
        最近更新 更多