我正在尝试在singup中将用户的时区作为字符串。示例:
$timezone = "Asia/Tel_Aviv";
在研究这个问题时,我了解了如何使用Javascript获取时区偏移量,但我仍然不清楚如何将时区偏移量转换为php中的时区字符串,如上所示
或者,我在Javascript/PHP中使用了其他哪种方法来获取每个用户的时区字符串?
我真的不知道该怎么办。
单用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
- 您无法从偏移量中获取时区名称。这是因为有很多时区在任何给定的时间都有相同的偏移量,所以你不能根据偏移量来选择一个。(如果你这样做了,当时区进入或离开夏令时时,这会让你大吃一惊,从而改变偏移量
- 你最好的选择是通过IP地址进行地理定位(谷歌一下,有很多材料),作为最佳的第一猜测,然后让用户选择自己的时区
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;
}
您需要遵循Nicholas Pickering和decze的答案♦部分。不要使用PHP
的timezone_name_from_abbr函数(参考)。
按照以下步骤获取用户系统中设置的任何时区的UTC时间:
-
Javascript(客户端):
var dateVar = new Date(); var offset = dateVar.getTimezoneOffset(); //getTimezoneOffset - returns the timezone difference between UTC and Local Time document.cookie = "offset="+offset;
-
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)