5

我试图在 singup 上将用户的时区作为字符串。例子:

$timezone = "Asia/Tel_Aviv";

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

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

我真的不知道如何解决这个问题。

4

4 回答 4

12

您不能仅在 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

于 2013-02-24T11:07:12.127 回答
3
  1. 您无法从偏移量中获取时区名称。那是因为在任何给定时间有许多时区具有相同的偏移量,因此您不能根据偏移量选择一个。(如果你这样做了,当时区进入或离开 DST 时,这会咬你一口,改变偏移量。
  2. 您最好的选择是通过 IP 地址进行地理定位(谷歌它,那里有很多材料)作为最好的初步猜测,然后让用户自己选择他的时区
于 2013-02-24T11:06:40.323 回答
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;
}
于 2014-01-11T19:48:48.290 回答
2
于 2018-09-17T14:18:33.067 回答