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

голоса
529

Есть ли стандартный способ для веб-сервера, чтобы иметь возможность определить часовой пояс пользователя в веб-страницы?

Возможно, из заголовка HTTP или часть строки агента пользователя?

Задан 01/08/2008 в 01:42
источник пользователем
На других языках...                            


25 ответов

голоса
302
-new Date().getTimezoneOffset()/60;

Метод getTimezoneOffset()будет вычитать время от GMT и возвращает количество минут. Так что если вы живете в GMT-8, он будет возвращать 480.

Для того, чтобы поставить это в часы, разделить на 60. Кроме того, обратите внимание, что знак является противоположностью того, что вам нужно - это вычисление GMT-х смещение от часового пояса, а не часовой пояс это смещение от GMT. Чтобы это исправить, нужно просто умножить на -1.

Также отметим , что W3School говорит:

Возвращаемое значение не является постоянной, из-за практики использования летнего времени.

Ответил 27/11/2009 в 18:52
источник пользователем

голоса
174

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

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

Ответил 03/08/2008 в 20:30
источник пользователем

голоса
77

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

Если бы это был я, я бы, вероятно, попытается извлечь часовой пояс с помощью JavaScript и клиентской затем отправить его на сервер с помощью Ajax или что-то.

Ответил 01/08/2008 в 13:19
источник пользователем

голоса
47

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

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

Ответил 01/08/2008 в 16:11
источник пользователем

голоса
39

Вот надежное решение JavaScript, чтобы определить часовой пояс браузер находится.

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

Ответил 06/08/2012 в 22:22
источник пользователем

голоса
34

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

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

За исключением ниже:

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)

Ответил 30/03/2011 в 21:48
источник пользователем

голоса
26

Используя подход Unkwntech, я написал функцию с помощью JQuery и PHP. Это проверено и работает!

На странице PHP, где вы хотите иметь часовой пояс в качестве переменной, есть этот фрагмент кода где-то в верхней части страницы:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

Это будет читать переменный сеанс «время», который мы сейчас собирается создать.

На той же странице, в, вы должны в первую очередь включают в JQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

Также в, ниже JQuery, вставьте:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Вы можете или, возможно, не заметили, но вы должны изменить URL для вашего фактического домена.

Одна последняя вещь. Вы, наверное , интересно , что щеколда timezone.php есть. Ну, это просто: (создать новый файл под названием timezone.php и указать на ней с указанным URL)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

Если это работает правильно, он будет сначала загрузить страницу, выполнить JavaScript и перезагрузите страницу. После этого вы сможете прочитать переменный часовой пояс $ и использовать его для вашего удовольствия! Она возвращает текущий часовой пояс UTC / GMT смещение (GMT -7) или любой другой часовой пояс вы находитесь.

Ответил 09/04/2011 в 20:16
источник пользователем

голоса
18

Во- первых, понять , что обнаружение часового пояса в JavaScript является несовершенным. Вы можете получить местное смещение часового пояса для определенной даты и времени , используя getTimezoneOffsetна экземпляр Dateобъекта, но это не совсем так же , как полный IANA часового пояса , как America/Los_Angeles.

Есть несколько вариантов, которые могут работать, хотя:

  • Большинство современных браузеров поддерживают часовых поясов IANA в их реализации API ECMAScript Интернационализация , так что вы можете сделать это:

    const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
    

    Результат является строкой, содержащей установку часового пояса IANA компьютера, на котором код выполняется.

    Поддерживаемые среды, перечислены в таблице совместимости Intl . Разверните DateTimeFormatраздел, и посмотрите на функцию с именем resolvedOptions().timeZone defaults to the host environment.

  • Если вам необходимо поддерживать более широкий набор условий, такие , как более старые браузеры, вы можете использовать библиотеку , чтобы сделать обоснованное предположение в часовом поясе. Они работают по первым попробовав IntlAPI , если он доступен, и когда он не доступен, они опрашивать getTimezoneOffsetфункцию Dateобъекта, для нескольких различных точек во время, используя результаты , чтобы выбрать часовой пояс из внутреннего набора данных.

    Оба jsTimezoneDetect и момент-часовой пояс имеют эту функциональность.

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();
    

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

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

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

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

Ответил 25/03/2014 в 04:47
источник пользователем

голоса
18

Для того, чтобы представить смещение часового пояса в качестве HTTP - заголовка на AJAX запросы с JQuery

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

Вы также можете сделать что - то подобное , чтобы получить фактическое время название зоны, используя moment.tz.guess();от http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

Ответил 13/09/2012 в 03:05
источник пользователем

голоса
18

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

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

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

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

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

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

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

Ответил 30/08/2012 в 06:08
источник пользователем

голоса
16

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

-new Date().getTimezoneOffset()/60;
Ответил 27/05/2012 в 18:25
источник пользователем

голоса
16

С датой 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();
?>

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

Ответил 16/09/2010 в 06:59
источник пользователем

голоса
16

Кто-нибудь знает о каких-либо услуг, которые будут соответствовать IP географическому положению

Ну, вам повезло , что ответ можно найти на нашем собственном сайте StackOverflow: Как получить страну в соответствии с определенным IP?

спойлер: http://www.hostip.info/use.html

Ответил 04/08/2008 в 12:11
источник пользователем

голоса
15

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 Timestamp этой функции, JavaScript уже знает, часовой пояс пользователя.

как это:

PHP:

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

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

Ответил 28/08/2011 в 00:00
источник пользователем

голоса
14

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

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

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

Ответил 02/01/2013 в 19:05
источник пользователем

голоса
14

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

visitortime.getTimezoneOffset()

Это круто, я не знал об этом. Работает ли это в IE, и т.д.? Оттуда вы должны быть в состоянии использовать JS Аякс, устанавливать кук, что угодно. Я бы, вероятно, пойти Кук прокладывайте себе.

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

Ответил 03/08/2008 в 21:40
источник пользователем

голоса
11

Простой способ сделать это состоит в использовании:

new Date().getTimezoneOffset();
Ответил 01/12/2011 в 12:08
источник пользователем

голоса
11

Если вам случится быть с помощью OpenID для аутентификации, простая регистрация Расширение позволит решить проблему для идентифицированных пользователей (Вам нужно преобразовать из TZ в числовой).

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

Ответил 30/08/2008 в 10:29
источник пользователем

голоса
10

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

Пора

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

Ответил 25/05/2010 в 01:11
источник пользователем

голоса
8

Простой с JSи PHP:

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

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

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

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

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 db
$created = date("F j, Y, g:i a",$date_created);//return it to the user or whatever

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

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

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

Ответил 15/09/2014 в 02:19
источник пользователем

голоса
7

Попробуйте этот код 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'];
?>
Ответил 30/07/2012 в 09:08
источник пользователем

голоса
7

Вот как я это делаю. Это позволит установить часовой пояс 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
?>
Ответил 28/01/2012 в 09:21
источник пользователем

голоса
6

Одним из возможных вариантов является использование Dateполя заголовка, который определен в RFC 7231 и предполагается включить часовой пояс. Конечно, это не гарантирует , что значение действительно часовой пояс клиента, но это может быть удобной отправной точкой.

Ответил 09/09/2014 в 00:25
источник пользователем

голоса
5

Получение действительного 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;

Я написал сообщение в блоге на нем: http://usefulangle.com/post/31/detect-user-browser-timezone-name-in-php Он содержит демо также.

Ответил 10/01/2017 в 11:56
источник пользователем

голоса
5

вы могли бы сделать это на клиенте с моментом-часовым поясом и отправить значение на сервер; Пример использования:

> moment.tz.guess()
"America/Asuncion"
Ответил 13/09/2016 в 06:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more