html - часовой - title тег




Определить часовой пояс пользователя (16)

Существует ли для веб-сервера стандартный способ определения часового пояса пользователя на веб-странице?

Возможно из заголовка HTTP или части строки user-agent ?


Вот как я это делаю. Это установит часовой пояс PHP по умолчанию на местный часовой пояс пользователя. Просто вставьте следующее в верхней части всех ваших страниц:

<?php
session_start();

if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
        <script>
        var d = new Date()
        var offset= -d.getTimezoneOffset()/60;
        location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
        <?php   
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}

date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>

Вы можете сделать это на клиенте с moment-timezone и отправить значение на сервер; пример использования:

> moment.tz.guess()
"America/Asuncion"

Получение правильного имени часового пояса базы данных TZ в PHP - это двухэтапный процесс:

  1. С помощью JavaScript можно получить смещение часового пояса за минуты getTimezoneOffset . Это смещение будет положительным, если местный часовой пояс отстает от UTC, и отрицательным, если оно впереди. Таким образом, вы должны добавить противоположный знак к смещению.

    var timezone_offset_minutes = new Date().getTimezoneOffset();
    timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;

    Передайте это смещение в PHP.

  2. В PHP преобразуйте это смещение в правильное имя часового пояса с помощью функции timezone_name_from_abbr .

    // Just an example.
    $timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']
    
    // Convert minutes to seconds
    $timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);
    
    // America/Chicago
    echo $timezone_name;</code></pre>

Я написал пост в блоге: Как определить часовой пояс пользователя в PHP . Он также содержит демо.


Попробуйте этот код PHP:

<?php
    $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=" . $ip . "&full=true");
    $json = json_decode($json,true);
    $timezone = $json['LocalTimeZone'];
?>

JavaScript - это самый простой способ узнать местное время клиента. Я бы предложил использовать XMLHttpRequest для отправки назад по местному времени, а если это не удастся, вернуться к часовому поясу, обнаруженному на основе их IP-адреса.

Что касается геолокации, я использовал MaxMind GeoIP в нескольких проектах, и он работает хорошо, хотя я не уверен, предоставляют ли они данные о часовых поясах. Это услуга, за которую вы платите, и они ежемесячно обновляют вашу базу данных. Они предоставляют обертки на нескольких веб-языках.


JavaScript:

function maketimus(timestampz)
{
    var linktime = new Date(timestampz * 1000);
    var linkday = linktime.getDate();
    var freakingmonths = new Array();

    freakingmonths[0]  = "jan";
    freakingmonths[1]  = "feb";
    freakingmonths[2]  = "mar";
    freakingmonths[3]  = "apr";
    freakingmonths[4]  = "may";
    freakingmonths[5]  = "jun";
    freakingmonths[6]  = "jul";
    freakingmonths[7]  = "aug";
    freakingmonths[8]  = "sep";
    freakingmonths[9]  = "oct";
    freakingmonths[10] = "nov";
    freakingmonths[11] = "dec";

    var linkmonthnum = linktime.getMonth();
    var linkmonth = freakingmonths[linkmonthnum];
    var linkyear = linktime.getFullYear();
    var linkhour = linktime.getHours();
    var linkminute = linktime.getMinutes();

    if (linkminute < 10)
    {
        linkminute = "0" + linkminute;
    }

    var fomratedtime = linkday + linkmonth + linkyear + " " +
                       linkhour + ":" + linkminute + "h";
    return fomratedtime;
}

Просто укажите время в формате метки времени Unix для этой функции; JavaScript уже знает часовой пояс пользователя.

Нравится:

PHP:

echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';

Это всегда будет правильно показывать время в зависимости от часового пояса, который человек установил на своих компьютерных часах. Слава богу, не нужно никому ничего просить и сохранять на местах.


Волшебство все, кажется, в

visitortime.getTimezoneOffset()

Это круто, я не знал об этом. Работает ли это в Internet Explorer и т. Д.? Оттуда вы сможете использовать JavaScript для Ajax, устанавливать куки, что угодно. Я бы, наверное, сам пошел по пути печенья.

Вы должны будете позволить пользователю изменить это все же. Мы пытались использовать геолокацию (через maxmind), чтобы сделать это некоторое время назад, и это было достаточно разумно неправильно - достаточно, чтобы этого не стоило делать, поэтому мы просто позволяем пользователю установить его в своем профиле и показываем уведомление пользователям, которые еще не установил их.


Вот более полный путь.

  1. Получить смещение часового пояса для пользователя
  2. Протестируйте несколько дней на границах летнего времени, чтобы определить, находятся ли они в зоне, где используется летнее время.

Выдержка ниже:

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    // Go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        // To ignore daylight saving time look for the lowest offset.
        // Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

Получение TZ и DST от JS (через Way Back Machine)


Вот статья (с исходным кодом), которая объясняет, как определить и использовать локализованное время в приложении ASP.NET (VB.NET, C #):

Пора

Вкратце, описанный подход опирается на функцию getTimezoneOffset JavaScript, которая возвращает значение, которое сохраняется в getTimezoneOffset cookie сеанса и используется программным кодом для настройки значений времени между GMT и местным временем. Приятно то, что пользователю не нужно указывать часовой пояс (код делает это автоматически). В этом участвует больше (поэтому я и делаю ссылку на статью), но предоставленный код делает его действительно простым в использовании. Я подозреваю, что вы можете преобразовать логику в PHP и другие языки (при условии, что вы понимаете ASP.NET).


Если вы используете OpenID для аутентификации, Simple Registration Extension решит проблему для аутентифицированных пользователей (вам нужно будет конвертировать из tz в число).

Другим вариантом будет вывод часового пояса из предпочтения страны агента пользователя. Это довольно грубый метод (не подходит для en-US), но он хорошо подходит.


Легко, просто используйте функцию JavaScript getTimezoneOffset следующим образом:

-new Date().getTimezoneOffset()/60;

Не используйте IP-адрес для окончательного определения местоположения (и, следовательно, часового пояса) - это потому, что с NAT, прокси (все более популярными) и VPN, IP-адреса не обязательно реалистично отражают фактическое местоположение пользователя, но местоположение, в котором серверы, реализующие эти протоколы находятся.

Подобно тому, как коды США в США больше не используются для определения местоположения пользователя телефона, учитывая популярность переносимости номеров.

IP-адрес и другие методы, показанные выше, полезны для указания значения по умолчанию, которое пользователь может настроить / исправить.


С помощью функции date PHP вы получите дату и время сервера, на котором расположен сайт. Единственный способ получить пользовательское время - использовать JavaScript.

Но я предлагаю вам, если на вашем сайте требуется регистрация, тогда лучше всего попросить пользователя пройти регистрацию в качестве обязательного поля. Вы можете перечислить различные часовые пояса на странице регистрации и сохранить их в базе данных. После этого, если пользователь входит на сайт, вы можете установить часовой пояс по умолчанию для этого сеанса в соответствии с выбранным часовым поясом пользователей.

Вы можете установить любой конкретный часовой пояс с помощью функции PHP date_default_timezone_set . Это устанавливает указанный часовой пояс для пользователей.

По сути, часовой пояс пользователя относится к клиентской части, поэтому мы должны использовать JavaScript для этого.

Ниже приведен скрипт для получения часового пояса пользователей с использованием PHP и JavaScript.

<?php
    #http://www.php.net/manual/en/timezones.php List of Time Zones
    function showclienttime()
    {
        if(!isset($_COOKIE['GMT_bias']))
        {
?>

            <script type="text/javascript">
                var Cookies = {};
                Cookies.create = function (name, value, days) {
                    if (days) {
                        var date = new Date();
                        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                        var expires = "; expires=" + date.toGMTString();
                    }
                    else {
                        var expires = "";
                    }
                    document.cookie = name + "=" + value + expires + "; path=/";
                    this[name] = value;
                }

                var now = new Date();
                Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
                window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
            </script>

            <?php

        }
        else {
          $fct_clientbias = $_COOKIE['GMT_bias'];
        }

        $fct_servertimedata = gettimeofday();
        $fct_servertime = $fct_servertimedata['sec'];
        $fct_serverbias = $fct_servertimedata['minuteswest'];
        $fct_totalbias = $fct_serverbias  $fct_clientbias;
        $fct_totalbias = $fct_totalbias * 60;
        $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
        $fct_time = time();
        $fct_year = strftime("%Y", $fct_clienttimestamp);
        $fct_month = strftime("%B", $fct_clienttimestamp);
        $fct_day = strftime("%d", $fct_clienttimestamp);
        $fct_hour = strftime("%I", $fct_clienttimestamp);
        $fct_minute = strftime("%M", $fct_clienttimestamp);
        $fct_second = strftime("%S", $fct_clienttimestamp);
        $fct_am_pm = strftime("%p", $fct_clienttimestamp);
        echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
    }

    showclienttime();
?>

Но, с моей точки зрения, лучше спросить пользователей, является ли регистрация обязательной в вашем проекте.


Самый популярный (== стандартный?) Способ определения часового пояса, который я видел вокруг, это просто опрос самих пользователей. Если ваш сайт требует подписки, это может быть сохранено в данных профиля пользователя. Для всех пользователей даты могут отображаться в формате UTC, GMT или как-то так.

Я не пытаюсь быть умным человеком. Просто иногда у некоторых проблем есть более тонкие решения вне контекста программирования.


Это просто с JavaScript и PHP:

Несмотря на то, что пользователь может связываться со своими внутренними часами и / или часовым поясом, лучший способ найти смещение, который я нашел до сих пор, остается new Date().getTimezoneOffset(); , Он неинвазивен, не доставляет головной боли и устраняет необходимость полагаться на третьих лиц.

Скажем, у меня есть таблица users , которая содержит поле date_created int(13) для хранения меток времени Unix;

Предполагая, что клиент creates a new account , данные принимаются по post , и мне нужно insert/update date_created column с меткой времени клиента Unix, а не сервера.

Поскольку timezoneOffset необходим во время вставки / обновления, он передается как дополнительный элемент $ _POST, когда клиент отправляет форму, тем самым устраняя необходимость сохранять его в сеансах и / или файлах cookie, а также при отсутствии дополнительных обращений к серверу.

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;

Скажем, сервер получает tzo как $_POST['tzo'] ;

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);

Вставить / обновить date_created=$user_timestamp .

При получении date_created вы можете преобразовать отметку времени следующим образом:

$date_created = // Get from the database
$created = date("F j, Y, g:i a",$date_created); // Return it to the user or whatever

Теперь этот пример может соответствовать first вашим потребностям, когда дело доходит до вставки метки времени ... Когда речь идет о дополнительной метке времени или таблице, вы можете рассмотреть возможность вставки значения tzo в таблицу пользователей для последующего использования или установки его. как сеанс или как cookie.

PS НО что если пользователь путешествует и переключает часовые пояса. Вход в GMT + 4, быстрое перемещение в GMT-1 и вход снова. Последний логин будет в будущем.

Я думаю ... мы слишком много думаем.


Я до сих пор не видел подробный ответ здесь, который получает часовой пояс. Вам не нужно геокодировать по IP-адресу или использовать PHP (смеется) или неправильно угадывать смещение.

Во-первых, часовой пояс - это не просто смещение от GMT. Это участок земли, в котором временные правила устанавливаются местными стандартами. В некоторых странах есть летнее время, и в разное время включается летнее время. Обычно важно получить фактическую зону, а не только текущее смещение.

Если вы намереваетесь сохранить этот часовой пояс, например, в пользовательских настройках вы хотите зону, а не только смещение. Для преобразований в реальном времени это не будет иметь большого значения.

Теперь, чтобы получить часовой пояс с JavaScript, вы можете использовать это:

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

Однако я обнаружил, что проще использовать этот надежный плагин, который возвращает форматированный часовой пояс Олсена:

https://github.com/scottwater/jquery.detect_timezone





timezone-offset