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

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

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

 Felix Kling25 мар. 2014 г., 00:10
Я неНе думаю, что есть встроенный API, который дает название часового пояса. Вы должны прибегнуть к какой-либо внешней службе или библиотеке для этого.
 Michael Tsang20 февр. 2019 г., 05:53
Я неЯ думаю, что это возможно, если пользователь не отправит информацию на сервер. Это должно быть обработано на стороне клиента.
 Felix Kling24 мар. 2014 г., 19:50
Ты имеешь ввидуstackoverflow.com/q/1091372/218196?
 chris24 мар. 2014 г., 20:00
Нетне может помочь моей текущей причине, хотя выглядит полезным для других вещей. Что мне нужно сделать, это взятьgetTimezoneOffset() минут, и передать их чему-то, что даст мнеAmerica/Los_Angeles например. Или передать что-то в функцию, которая даст мне это или эквивалент. Я не хочу показывать время, основываясь на том, что пользователь установил часовой пояс больше, чем на то, где что-то произошло.
 agnoster11 нояб. 2010 г., 09:48
Тогда пользователь, вероятно, нене волнует?
 Braiam05 окт. 2018 г., 17:15
Зачем вам нужно знать часовой пояс пользователя?
 Rob Williams02 дек. 2008 г., 01:51
Спросите пользователя. Если вы получаете часовой пояс от пользователяс компьютера, и он установлен неправильно, то что?
 sven04 авг. 2008 г., 13:11
Что ж, к счастью для вас, этот ответ можно найти на нашем собственном веб-сайте stackoverflow:stackoverflow.com/questions/1033/ip-to-country спойлер:hostip.info/use.html
 William Entriken25 сент. 2018 г., 01:41
К сожалению, ответы на этот вопрос также позволяют для профилирования пользователей и геозон.
 DaveG08 февр. 2019 г., 16:46
@Braiam В нашем случае мы хотим отображать данные со временем в пользовательскомчасовой пояс

Ответы на вопрос(24)

просто используйте JavaScriptgetTimezoneOffset функционировать так:

-new Date().getTimezoneOffset()/60;
 Matt Johnson13 июл. 2014 г., 00:45
Кроме того, он только возвращаетток смещение часового пояса - нечасовой пояс, Увидетьтег часового пояса вики.
 Rambatino12 окт. 2018 г., 23:59
Это всего лишь копия принятого ответа, почему вы даже голосуете за него.
 cincodenada16 февр. 2013 г., 02:05
Это функция Javascript, а не функция PHP.

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

> moment.tz.guess()
"America/Asuncion"
 Legends07 нояб. 2017 г., 23:37
Название функции говорит все о ее точности ;-)
 Dan Dascalescu17 мар. 2019 г., 06:45
В настоящее время, moment.js я больше не рекомендую. Есть намного меньшие альтернативы в настоящее время (dayjs,дата-FNS).Момент огромен.

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

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

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

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

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

 Mikko Rantalainen18 мая 2017 г., 13:30
@Matthieu существует лучший ответ в настоящее время:stackoverflow.com/a/11836123/334451
 Matthieu17 мая 2017 г., 18:31
@MikkoRantalainen осторожны при использовании прокси, так как они неВсегда рекламируйте себя в заголовках.
 TTT18 февр. 2016 г., 23:32
Странно, это единственныйправильный Ответьте на вопрос, который спрашивает, как это сделать на стороне сервера. Я подозреваю, что причина в том, что есть другие ответы с большим количеством голосов, состоит в том, что как только вы понимаете, что вам нужно сделать это на стороне клиента, вы в конечном итоге используете другие ответы. Но ИМХО любой, кто голосует против другого ответа, должен голосовать против этого тоже.
 Mikko Rantalainen16 февр. 2017 г., 11:47
Я считаю, что лучший способ - использовать гео-ip местоположение для сортировки возможных часовых поясов и по умолчанию выбрать первый, который (близко) соответствует временному смещению агента пользователя (требуется JavaScript). Даже после этого вы должны предоставить способ исправить часовой пояс после того, как даже этот метод выберет неправильный.
 lscoughlin24 апр. 2019 г., 11:42
Это буквально единственный ответ, который фактически ответил на поставленный вопрос.

как я это делаю Это установит часовой пояс 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
?>
 IMSoP02 февр. 2015 г., 18:40
Это нет счета за "летнее время " корректировки - пользователь в Дублине будет соответствовать вашемуЕвропа / Дублин зимой, ноЕвропа / Белград» летом. Если ты'Если вы собираетесь использовать текущее смещение, все, что вы можете разумно предположить, это смещение, а не географический идентификатор.

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

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

 G-Wiz09 авг. 2011 г., 22:20
Это нене может ответить на вопрос, который явно подразумевает, что онИщем технологическое решение.
 Triynko10 февр. 2015 г., 21:30
Лучшим решением, вероятно, было бы сочетание запроса пользователя (например, предоставление раскрывающегося списка часовых поясов в верхней части отчета), при этом по умолчанию выбранный раскрывающийся список выбирает часовой пояс, определяемый GPS, когда пользователь находится на мобильном телефоне. устройство, которое предоставляет информацию о местоположении, и по умолчанию UTC.
 Rajat Gupta22 июл. 2011 г., 10:04
@Ishmaeel: но пользователи путешествуют по всему миру, и им не нужно указывать свой часовой пояс каждый раз, когда они входят в какой-то не родной часовой пояс
 Pascal28 авг. 2016 г., 11:38
@ user01 Вы не можете сделать такое общее утверждение и думать, что это правильно для всех ситуаций. Существует достаточно приложений с профилем пользователя, где пользователь не путешествует каждый день. Таким образом, выпадающий список с часовыми поясами на выбор подходит для "самый" пользовательские требования.
 Simon Bergot06 апр. 2012 г., 12:26
@gWiz OP просит стандартное решение. Это довольно стандартно.
 Xiè Jìléi18 февр. 2011 г., 02:33
Почему бы не принять это как правильный ответ? Ответ, данный Unkwntech, даже не работает для не-IE браузеров.
 Marcy Sutton27 янв. 2011 г., 22:57
Как насчет того, когда пользователь загружает файл .ics, который должен иметь время начала, определенное для его местоположения (например, 9-11 утра по всей стране)? Они не должныЯ должен сказать, какой у них часовой пояс.

С подходом я написал функцию, используя 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://example.org/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Вы можете заметить, а можете и не заметить, но вам нужно изменить URL-адрес на свой фактический домен.

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

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

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

 IMSoP02 февр. 2015 г., 18:34
Это'Вероятно, проще использовать Cookie, чем Session, чтобы транспортировать это, поскольку блокировка и десериализация сеанса PHP может привести к замедлению работы вашего приложения. Для максимальной эффективности вы можете скопировать значение в сеанс и удалить cookie, чтобы онне отправляются в последующих запросах.
 Christopher Chase15 сент. 2011 г., 06:59
Мне нравится это, но у меня может быть что-то, что проверяет текущую $ _SESSION ['время'] и только перезагрузить JavaScript, если он отличается

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>';

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

 user617319815 сент. 2016 г., 07:09
$ unix_timestamp_ofshiz? Что-то здесь не хватает и неЭто не работает, хотя это может быть хорошим ответом.

в котором находится браузер.

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

https://bitbucket.org/pellepim/jstimezonedetect

 Dirbaio01 нояб. 2016 г., 02:34
Это! Это путь. Простая библиотека, правильно обрабатывает DST. Другие ответы полны WTF и многие нет делать DST.
 Mikko Rantalainen18 мая 2017 г., 13:25
Эта библиотека очень умная. Он работает, запрашивая текущее смещение в UTC, затем корректируя время объекта JavaScript Date, добавляя или вычитая секунды, пока смещение к UTC не изменится. Используя этот метод, эта библиотека вычисляет достаточно изменений DST, чтобы однозначно идентифицировать часовой пояс. Я думаю, что библиотека могла бы иметь даже лучшую производительность, если бы она выполняла бинарный поиск вместо линейного поиска. Возвращаемым значением является информационный ключ зоны IANA (он же база данных часовых поясов Олсона).
 Dan Dascalescu17 мар. 2019 г., 06:41
Эта библиотека больше не нужна. Современные браузеры поддерживают API-интерфейс Intl, который возвращает строку часового пояса IANA. Увидетьэтот ответ
 IMSoP02 февр. 2015 г., 18:32
Ответы, содержащие только ссылки, не приветствуются, поскольку, если ссылка исчезает, ответ перестает быть полезным; и потому что, не переходя по ссылке, читатели нене знаю, дает ли это хороший ответ. В этом случае вы могли бы уточнить, что это сторонняя библиотека, которая использует основанный на базе данных подход к идентификации, и, возможно, объяснить некоторые принципы ее работы.

Простой способ сделать это с помощью:

new Date().getTimezoneOffset();
 chown30 янв. 2012 г., 02:01
Почему вы перепечатали идентичный ответ (от Джона Айзекса) от 2 лет назад:stackoverflow.com/a/1809974/836407?
 Matt Johnson13 июл. 2014 г., 00:46
Кроме того, он только возвращаетток смещение часового пояса - нечасовой пояс, Увидетьтег часового пояса вики.

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

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

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

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

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)

 arlomedia15 апр. 2012 г., 21:35
Это сработало для меня! Прочитайте комментарии под сообщением в блоге для пары обновлений кода.
 Matt Johnson13 июл. 2014 г., 00:52
Это все еще только вернетстандартное смещение для часового пояса, например +02: 00. Это не даст вам достаточно информации, чтобы определитьчасовой пояс пользователя, такие какAfrica/Johannesburg или жеEurope/Istanbul, Увидетьтег часового пояса вики.

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

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

 Peter O.01 дек. 2011 г., 08:11
Смотрите такжеэтот вопрос.
 Peter O.20 нояб. 2011 г., 07:52
Я проголосовал за этот ответ, потому что широта и долгота, полученные из баз данных, таких как GeoIP (на данный момент имеется бесплатная версия), могут быть объединены с базами данных, которые преобразуют такие координаты в часовой пояс. Я думаю, что у GeoNames есть последняя такая база данных.
 Matthew Slyman23 дек. 2015 г., 22:26
Текущие версии (как платные, так и бесплатные) баз данных / API MaxMind GeoIP действительно предоставляют информацию о часовом поясе (она возвращает)Europe / London» для моего часового пояса.) Я могуНе помню, делала ли старая версия их системы GeoIP то же самое, но теперь она работает очень хорошо! Поля MaxMind называются "часовой пояс", "time_zone_name».

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

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

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

Поскольку 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

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

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

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

двухэтапный процесс:

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

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

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

В PHP преобразуйте это смещение в правильное имя часового пояса с помощьюtimezone_name_from_abbr function.I»

// 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;

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

 Michael Tsang20 февр. 2019 г., 05:56
Я думаю, что более простой процесс заключается вIntl.DateTimeFormat().resolvedOptions().timeZone и отправить его на веб-сервер. Ref:stackoverflow.com/questions/9772955/...

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

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

Вы можете установить любой конкретный часовой пояс, используя функцию PHPdate_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();
?-->

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

который получает часовой пояс. Ты не долженНе нужно геокодировать по 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

осов 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/

 Matt Johnson13 июл. 2014 г., 00:47
Это только возвращаетток смещение часового пояса - нечасовой пояс, Увидетьтег часового пояса вики.
 philfreo27 мар. 2017 г., 20:08
Отредактировано, чтобы включить информацию о том, как сделать то же самое для названия часового пояса.

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

visitortime.getTimezoneOffset()

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

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

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

Это'о времени

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

 Ivaylo Slavov07 окт. 2013 г., 10:41
Статья доступна также в виде PDF здесь:app.box.com/shared/bfvvmidtyg
 Stephen Blair23 янв. 2015 г., 18:25
Описанный в этой статье метод преобразования времени сервера UTC в время локального клиента неверен. Использование текущего клиентского смещения для настройки времени UTC на сервере приведет к неправильномуместный" время для полугодия для клиентских регионов, которые соблюдают переход на летнее время. Рассмотрим следующий сценарий: клиент в Великобритании 14 января 2013 года (GMT + 0000 по стандартному времени) устанавливает дату и время 21 августа 2015 года в 14:00 (GMT + 0100 летнее время). Это нормализуется на сервере до 21 августа 2015 года 13:00 UTC. В день, когда это происходит, смещение клиента равно 0, поэтому время, отправленное обратно клиенту, будет 21 августа 2015 года, 13:00.
 Gan21 мар. 2013 г., 04:56
Ссылка мертва. Я думаю, что это альтернативная ссылка:devproconnections.com/article/aspnet2/it-s-about-time-122778
 Alek Davis24 янв. 2015 г., 01:25
Действительная точка, но я нене утверждаю, что это пуленепробиваемое решение. Если вам нужно внедрить действительно чувствительное ко времени решение, скажем, приложение для бронирования билетов на поезд, вам нужно найти более полное (и комплексное решение). Однако для многих приложений это не будет проблемой. Потому что во многих случаях мы хотим локализовать значения GMT для текущего сеанса. Теперь, если у вас есть приложение, которому нужно сохранить временную метку для некоторых даже в будущем, и оно не может переносить DTS, то правильным способом было бы предоставить опцию для экономии времени непосредственно в GMT. Если вы знаете лучший вариант, пожалуйста, поделитесь.

следует понимать, что определение часового пояса в 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

Некоторые библиотеки, такие какLuxon используйте этот API для определения часового пояса с помощью таких функций, как.luxon.Settings.defaultZoneName

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

И то и другоеjsTimezoneDetect а такжемомент- часовой пояс есть эта функциональность.

// using jsTimeZoneDetect
var tzid = jstz.determine().name();

// using moment-timezone
var tzid = moment.tz.guess();

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

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

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

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

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

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

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

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

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

 Rob17 июн. 2016 г., 04:45
Вопрос в том, как определить это на стороне сервера. Это код для клиента.
 hippietrail17 янв. 2012 г., 15:12
Тот'странно Для меня это возвращается-4 но я'м вGET что должно быть+4 - что мне не хватает? Я'проверил, что в моей ОС установлен правильный часовой пояс.
 Nischal09 сент. 2011 г., 16:57
А как насчет пользователей, которые используют сотовые телефоны с браузерами без поддержки JavaScript? Мне нравится вопрос, пользователь спрашивает о заголовках HTTP, пользовательском агенте ... есть ли способ сделать эту работу на стороне сервера максимально точной?
 xgretsch06 дек. 2013 г., 12:24
Я позволю себе не согласиться с Кейо. Определение getTimezoneOffset () (согласно стандарту ECMAecma-international.org/ecma-262/5.1/#sec-15.9.5.26) является "Возвращает разницу между местным временем и временем UTC в минутах. " - другими словами, необходимо учитывать летнее время. Mozilla»документация говорит "Летнее время не позволяет этому значению быть постоянным даже для данной локали. "
 sovemp07 апр. 2014 г., 23:16
@Mike Dimmick: Хотя это правда, сам вопрос спрашивает, есть ли способ получить смещение часового пояса, а не сам фактический часовой пояс, так что это должно быть правильно.
 Jason Walton30 июл. 2014 г., 21:30
Здесь нужно отметить одну вещь; в некоторых местах (например, в Ньюфаундленде в Канаде) часовые пояса отключены на полчаса, поэтому после деления на 60 ваш ответ может не быть целым числом.
 Mike Dimmick07 апр. 2014 г., 19:21
@xgretsch: получает пользовательток смещение от GMT. Тот'хорошо, если тыповторное представление другого времени, которое происходит в тот же день (если текущая дата не является датой перехода, где она может быть неправильной). Однако есть много часовых поясов, которые имеют одинаковое смещение от GMT, и они могут иметь разные даты переключения или не использовать летнее время.
 Triynko10 февр. 2015 г., 21:24
Пользователь'Часы компьютера могут быть неправильными, в этом случае это не получится. Например, если яЕсли я отправляю учителям отчет, в котором перечислены ответы учеников на вопросы с указанием их времени, а моя база данных хранит время в формате UTC, то мне нужно знать смещение часового пояса и пользователя.Текущее компьютерное время не имеет значения. Единственным способом надежного получения такого смещения было бы либо запросить пользователя (т.е. убедиться, что часовой пояс включен в запрос отчета, либо добавить раскрывающийся список для часового пояса над отчетом и выполнить преобразование на стороне клиента), либо определить пользователяФизическое местоположение с помощью GPS.
 xgretsch08 апр. 2014 г., 22:27
@ Майк Диммик: Ах, я понимаю вашу точку зрения. Я думаю, что нетпростой ответ на "какие'пользователь 'смещение часового пояса " - нужно спроситькакие'пользователь 'смещение часового пояса в определенный момент времени ", Я'Я начинаю думать, что единственный надежный способ сделать это - это одно из тех ужасных решений, когда вы устанавливаете часовой пояс, распечатываете время по местному времени и сравниваете то, что получили!
 Keyo30 авг. 2012 г., 05:49
Это неЯ всегда работаю на летнее время. Получить смещение часового пояса делает именно то, что он говорит. Это получитьсмещение. Часовая зона на самом деле географическая зона. Это победилоработать на летнее время, так как вы неНе знаю, в каком полушарии живет пользователь, или у его страны даже есть летнее время. Почему бы не использовать это вместо:>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
 Nathan16 февр. 2013 г., 05:16
Будет ли это работать для часовых поясов, таких какGMT +1? (Non-отрицательные).
 Mike Dimmick07 апр. 2014 г., 19:29
@Keyo: 'toTimeStringВыходные данные определяются реализацией:ecma-international.org/ecma-262/5.1/#sec-15.9.5.4, Нет гарантии, что в нем будет указано название часового пояса. Также нет гарантии, что если этоделает включите имя часового пояса, которое оно сопоставляет со всем, что знает сервер. Иногда это может работать в некоторых браузерах, но я бы не сталне люблю на это полагаться.
 JD Isaacks28 июн. 2010 г., 22:00
@jordanstephens Я не эксперт, поэтому я не знаю, есть ли обстоятельства, когда это не сработает, но у меня это сработало нормально.
 NudeCanalTroll30 янв. 2012 г., 00:30
getTimezoneOffset () возвращает количество минут, когда вы вычитаете свое текущее время из времени по Гринвичу. Так что, если вы живете в Калифорнии, этос PST, который GMT-8, так что вы8 часов позади. Вычтите это из GMT, используя getTimezoneOffset (), и оно вернется за 480 минут. Если вы хотите найти свое смещение, умножьте это на -1 и разделите на 60.
 jordanstephens28 июн. 2010 г., 21:54
это то, что имеет наибольшее значение для меня. есть ли причина, по которой это не должноили кто-то другой просто делает проблему более сложной, чем нужно.
 lscoughlin24 апр. 2019 г., 11:41
Это неЯ даже начал отвечать на вопрос.
 Kishor Pawar06 окт. 2016 г., 13:01
w3scool говоритThe returned value is not a constant, because of the practice of using Daylight Saving Time. как примечание.
 arlomedia15 апр. 2012 г., 21:36
Это неt учитывает переход на летнее и летнее время, но ссылка, опубликованная Джозефом Ластом, делает:stackoverflow.com/a/5492192/462162
 ingredient_1593903 янв. 2015 г., 10:16
Чтобы решить вышесказанное, почему бы не получить браузер?s текущее время (т. е. фактическое время, а не смещение), затем на стороне сервера определите смещение по Гринвичу путем сравнения браузера 'текущее время с сервератекущее время (при условии, что вы знаете сервер 'с собственным смещением по Гринвичу). Это кажется наименее проблемным решением для меня. Вы можете определить часовой пояс оттуда. В .NET, например, вы можете использоватьTimeZoneInfo циклически просматривать текущее время в каждой зоне, пока не будет найдено совпадение для браузера 's сообщенное время (или запрос онлайн-сервис времени).

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

 IMSoP02 февр. 2015 г., 18:43
К сожалению, этот заголовок в основном предназначен для ответов, а не запросов: "Пользовательский агент МОЖЕТ отправлять поле заголовка Date в запросе, хотя, как правило, не делает этого, если не считается, что он передает полезную информацию на сервер ». Я только что проверил, и Firefox не отправляет его.

Попробуйте этот код 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'];
?-->
 GingerPlusPlus15 авг. 2016 г., 14:38
Похожеapi.easyjquery.com больше недоступно

Ваш ответ на вопрос