用Javascript / PHP获取用户时区字符串?

时间:2013-02-24 10:44:59

标签: php timezone

我正在尝试将用户的时区作为单词上的字符串。例如:

$timezone = "Asia/Tel_Aviv";

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

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

我真的不确定如何处理这个问题。

4 个答案:

答案 0 :(得分:9)

单独使用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

答案 1 :(得分:2)

  1. 您无法从偏移中获取时区名称。那是因为在任何给定时间都有许多时区具有相同的偏移量,因此您无法根据偏移量选择一个时区。 (如果你这样做,当时区进入或退出夏令时时,这会让你陷入困境,改变偏移量。
  2. 你最好的选择是通过IP地址进行地理定位(谷歌,很多材料)作为最好的第一个猜测,然后给用户一个选择选择他的时区

答案 2 :(得分:2)

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;
}

答案 3 :(得分:1)

您需要部分遵循 Nicholas Pickering deceze♦ 的答案。请勿使用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)