Вопрос по timezone, php – Получить строку часового пояса пользователя с Javascript / PHP?

4

Я пытаюсь получить часовой пояс пользователя в виде строки при запуске. пример:

$timezone = "Asia/Tel_Aviv";

Исследуя проблему, я понял, какПолучить смещение часового пояса с Javascript, но мне все еще неясно,Как я могу перевести смещение часового пояса в строку часового пояса в php, как показано выше?

Или какой другой метод я использую в Javascript / PHP для получения строки часового пояса для каждого пользователя?

Я действительно не уверен, как подойти к этому.

Согласен - вы не можете сделать это только на PHP. Ваш сервер не получает эту информацию в качестве заголовка. Nicholas Pickering
вы не можете получить часовой пояс пользователя, так как PHP - это серверный язык. вам нужно будет сначала получить его с помощью JavaScript, а затем отправить его на свой сервер kennypu
Самый простой способ сделать это - установить javascript в cookie, а затем вы можете получить cookie в PHP. Nicholas Pickering

Ваш Ответ

4   ответа
2
Вы не можете получить название часового пояса из смещения. Это потому, что есть много часовых поясов, которые имеют одинаковое смещение в любой момент времени, поэтому вы не можете выбрать один из них на основе смещения. (Если вы это сделаете, это укусит вас в задницу позже, когда часовой пояс войдет в летнее время или выйдет из него, изменив смещение.Лучше всего сначала сделать геолокацию по IP-адресу (Google, там много материала), а затем дать пользователю возможностьвыбрать свой часовой пояс сам.
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;
}
9

Вы можете использовать Javascript для установки значения в куки, а затем использовать PHP для чтения куки на следующей странице (пере) загрузки.

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

@ Рой, я думаю, что получил это время. Nicholas Pickering
Я работаю над этой маленькой деталью ...:] Nicholas Pickering
Но, как написала Дечезе, это не поможет мне создать солидный часовой пояс или нет? Может быть, не важно настаивать на строках часовых поясов? Roy
1

Николас Пикеринг а такжеdeceze ♦ частично. Не используй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)

Похожие вопросы