Существует ли для веб-сервера стандартный способ определения часового пояса пользователя на веб-странице?
Возможно, из заголовка HTTP или части user-agent
строки?
html
browser
timezone
user-agent
timezone-offset
Кевин Денте
источник
источник
Ответы:
Метод
getTimezoneOffset()
вычитает ваше время из GMT и возвращает количество минут. Так что если вы живете в GMT-8, он вернется 480.Чтобы перевести это в часы, разделите на 60. Также обратите внимание, что знак противоположен тому, что вам нужно - это расчет смещения GMT от вашего часового пояса, а не смещения вашего часового пояса от GMT. Чтобы это исправить, просто умножьте на -1.
Также обратите внимание, что w3school говорит:
источник
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
Самый популярный (== стандартный?) Способ определения часового пояса, который я видел вокруг, это просто опрос самих пользователей.Если ваш сайт требует подписки, это может быть сохранено в данных профиля пользователя. Для всех пользователей даты могут отображаться в формате UTC, GMT или как-то так.
Я не пытаюсь быть умным человеком. Просто иногда у некоторых проблем есть более тонкие решения вне контекста программирования.
источник
Пока нет заголовков HTTP, которые сообщали бы о часовом поясе клиентов, хотя было предложено включить его в спецификацию HTTP.
Если бы это был я, я бы, вероятно, попытался получить часовой пояс, используя клиентский JavaScript, а затем отправить его на сервер, используя Ajax или что-то еще.
источник
JavaScript - это самый простой способ узнать местное время клиента. Я бы предложил использовать XMLHttpRequest для отправки назад по местному времени, а если это не удастся, вернуться к часовому поясу, обнаруженному на основе их IP-адреса.
Что касается геолокации, я использовал MaxMind GeoIP в нескольких проектах, и он работает хорошо, хотя я не уверен, предоставляют ли они данные о часовых поясах. Это услуга, за которую вы платите, и они ежемесячно обновляют вашу базу данных. Они предоставляют обертки на нескольких веб-языках.
источник
Во-первых, следует понимать, что определение часового пояса в JavaScript несовершенно. Вы можете получить смещение часового пояса для конкретной даты и времени, используя
getTimezoneOffset
экземплярDate
объекта, но это не совсем то же самое, что полный часовой пояс IANA, такой какAmerica/Los_Angeles
.Есть несколько вариантов, которые могут работать, хотя:
В результате получается строка, содержащая настройку часового пояса IANA компьютера, на котором выполняется код.
Поддерживаемые среды перечислены в таблице совместимости Intl . Разверните
DateTimeFormat
раздел и посмотрите на названную функциюresolvedOptions().timeZone defaults to the host environment
.Некоторые библиотеки, такие как Luxon, используют этот API для определения часового пояса с помощью таких функций, как
luxon.Settings.defaultZoneName
.Intl
API, если он доступен, а когда он недоступен, они запрашиваютgetTimezoneOffset
функциюDate
объекта в течение нескольких различных моментов времени, используя результаты для выбора подходящего часового пояса из внутреннего набора данных.Как jsTimezoneDetect, так и момент-время имеют эту функциональность.
В обоих случаях результат можно рассматривать только как предположение. Предположение может быть правильным во многих случаях, но не во всех.
Кроме того, эти библиотеки должны периодически обновляться, чтобы противодействовать тому факту, что многие старые реализации JavaScript знают только текущее правило перехода на летнее время для своего местного часового пояса. Подробнее об этом здесь.
В конечном счете, лучший подход - спросить вашего пользователя о его часовом поясе. Укажите настройки, которые они могут изменить. Вы можете использовать один из указанных выше вариантов, чтобы выбрать настройку по умолчанию , но не исключайте возможность отклонения от этого в своем приложении.
Существует также совершенно другой подход - не полагаться на настройку часового пояса на компьютере пользователя. Вместо этого, если вы можете собрать координаты широты и долготы, вы можете преобразовать их во временную зону одним из следующих способов . Это хорошо работает на мобильных устройствах.
источник
Вот надежное решение JavaScript для определения часового пояса, в котором находится браузер.
https://bitbucket.org/pellepim/jstimezonedetect
Приложение 1: Сейчас этот проект находится на GitHub: https://github.com/pellepim/jstimezonedetect
источник
Вот более полный путь.
Выдержка ниже:
Получение TZ и DST от JS (через Way Back Machine)
источник
Africa/Johannesburg
илиEurope/Istanbul
. Смотрите тег часового пояса вики .Используя подход Unkwntech, я написал функцию, используя jQuery и PHP. Это проверено и работает!
На странице PHP, где вы хотите использовать часовой пояс в качестве переменной, поместите этот фрагмент кода где-то в верхней части страницы:
Это будет читать сессионную переменную «время», которую мы сейчас собираемся создать.
На той же странице, в <head>, вам нужно прежде всего включить jQuery:
Также в <head>, ниже jQuery, вставьте это:
Вы можете заметить, а можете и не заметить, но вам нужно изменить URL-адрес на свой фактический домен.
Одна последняя вещь. Вы, наверное, задаетесь вопросом, что это за хрень timezone.php. Ну, это просто так: (создайте новый файл с именем timezone.php и укажите на него указанным выше URL)
Если это работает правильно, он сначала загрузит страницу, выполнит JavaScript и перезагрузит страницу. После этого вы сможете прочитать переменную $ timezone и использовать ее в свое удовольствие! Возвращает текущее смещение часового пояса UTC / GMT (GMT -7) или любой другой часовой пояс, в котором вы находитесь.
источник
Чтобы отправить смещение часового пояса в виде заголовка HTTP для запросов AJAX с помощью jQuery
Вы также можете сделать что - то подобное , чтобы получить фактическое время название зоны, используя
moment.tz.guess();
от http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/источник
Я до сих пор не видел подробный ответ здесь, который получает часовой пояс. Вам не нужно геокодировать по IP-адресу или использовать PHP (смеется) или неправильно угадывать смещение.
Во-первых, часовой пояс - это не просто смещение от GMT. Это участок земли, в котором временные правила устанавливаются местными стандартами. В некоторых странах есть летнее время, и в разное время включается летнее время. Обычно важно получить фактическую зону, а не только текущее смещение.
Если вы намереваетесь сохранить этот часовой пояс, например, в пользовательских настройках вам нужна зона, а не только смещение. Для преобразований в реальном времени это не будет иметь большого значения.
Теперь, чтобы получить часовой пояс с JavaScript, вы можете использовать это:
Однако я обнаружил, что проще использовать этот надежный плагин, который возвращает форматированный часовой пояс Олсена:
https://github.com/scottwater/jquery.detect_timezone
источник
С помощью
date
функции PHP вы получите дату и время сервера, на котором расположен сайт. Единственный способ получить пользовательское время - использовать JavaScript.Но я предлагаю вам, если на вашем сайте требуется регистрация, тогда лучше всего попросить пользователя пройти регистрацию в качестве обязательного поля. Вы можете перечислить различные часовые пояса на странице регистрации и сохранить их в базе данных. После этого, если пользователь входит в систему на сайте, вы можете установить часовой пояс по умолчанию для этого сеанса в соответствии с выбранным пользователем часовым поясом.
Вы можете установить любой часовой пояс, используя функцию PHP
date_default_timezone_set
. Это устанавливает указанный часовой пояс для пользователей.По сути, часовой пояс пользователей идет на стороне клиента, поэтому мы должны использовать JavaScript для этого.
Ниже приведен скрипт для получения часового пояса пользователей с использованием PHP и JavaScript.
Но, с моей точки зрения, лучше спросить пользователей, является ли регистрация обязательной в вашем проекте.
источник
Не используйте IP-адрес для окончательного определения местоположения (и, следовательно, часового пояса) - это потому, что с NAT, прокси (все более популярными) и VPN, IP-адреса не обязательно реалистично отражают фактическое местоположение пользователя, но местоположение, в котором серверы, реализующие эти протоколы находятся.
Подобно тому, как коды США в США больше не используются для определения местоположения пользователя телефона, учитывая популярность переносимости номеров.
IP-адрес и другие методы, показанные выше, полезны для предложения значения по умолчанию, которое пользователь может настроить / исправить.
источник
JavaScript:
Просто укажите время в формате метки времени Unix для этой функции; JavaScript уже знает часовой пояс пользователя.
Нравится:
PHP:
Это всегда будет правильно показывать время в зависимости от часового пояса, который человек установил на своих компьютерных часах. Слава богу, не нужно никому ничего просить и сохранять на местах.
источник
Легко, просто используйте
getTimezoneOffset
функцию JavaScript так:источник
Волшебство все, кажется, в
Это круто, я не знал об этом. Работает ли это в Internet Explorer и т. Д.? Оттуда вы сможете использовать JavaScript для Ajax, устанавливать куки, что угодно. Я бы, наверное, сам пошел по пути печенья.
Вы должны будете позволить пользователю изменить это все же. Мы пытались использовать геолокацию (через maxmind), чтобы сделать это некоторое время назад, и это было достаточно разумно неправильно - достаточно, чтобы этого не стоило делать, поэтому мы просто позволяем пользователю установить его в своем профиле и показываем уведомление пользователям, которые еще не установили их.
источник
Вот статья (с исходным кодом), которая объясняет, как определить и использовать локализованное время в приложении ASP.NET (VB.NET, C #):
Пора
Вкратце, описанный подход опирается на
getTimezoneOffset
функцию JavaScript , которая возвращает значение, которое сохраняется в файле cookie сеанса и используется компонентом кода для настройки значений времени между GMT и местным временем. Приятно, что пользователю не нужно указывать часовой пояс (код делает это автоматически). В этом участвует больше (поэтому я и делаю ссылку на статью), но предоставленный код делает его действительно простым в использовании. Я подозреваю, что вы можете преобразовать логику в PHP и другие языки (при условии, что вы понимаете ASP.NET).источник
Если вы используете OpenID для аутентификации, Simple Registration Extension решит проблему для аутентифицированных пользователей (вам нужно будет конвертировать из tz в число).
Другим вариантом будет вывод часового пояса из предпочтения страны агента пользователя. Это довольно грубый метод (не подходит для en-US), но он хорошо подходит.
источник
Это просто с 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, а также при отсутствии дополнительных обращений к серверу.
Скажем, сервер получает
tzo
как$_POST['tzo']
;Вставить / обновить
date_created=$user_timestamp
.При получении date_created вы можете преобразовать отметку времени следующим образом:
Теперь этот пример может соответствовать
first
вашим потребностям, когда дело доходит до вставки метки времени ... Когда речь идет о дополнительной метке времени или таблице, вы можете рассмотреть возможность вставки значения tzo в таблицу пользователей для последующего использования или установки его. как сеанс или как cookie.PS НО, что если пользователь путешествует и переключает часовые пояса. Вход в GMT + 4, быстрое перемещение в GMT-1 и вход снова. Последний логин будет в будущем.
Я думаю ... мы слишком много думаем.
источник
Вы можете сделать это на клиенте с моментом времени и отправить значение на сервер; пример использования:
источник
Получение правильного имени часового пояса базы данных TZ в PHP - это двухэтапный процесс:
С помощью JavaScript можно получить смещение часового пояса за минуты
getTimezoneOffset
. Это смещение будет положительным, если местный часовой пояс отстает от UTC, и отрицательным, если оно впереди. Таким образом, вы должны добавить противоположный знак к смещению.Передайте это смещение в PHP.
В PHP преобразуйте это смещение в правильное имя часового пояса с помощью функции timezone_name_from_abbr .
Я написал пост в блоге: Как определить часовой пояс пользователя в PHP . Он также содержит демо.
источник
Intl.DateTimeFormat().resolvedOptions().timeZone
и отправить его на веб-сервер. Ссылка: stackoverflow.com/questions/9772955/…Простой способ сделать это с помощью:
источник
Одним из возможных вариантов является использование
Date
поля заголовка, которое определено в RFC 7231 и должно включать часовой пояс. Конечно, не гарантируется, что значение действительно является часовым поясом клиента, но это может быть удобной отправной точкой.источник
Вот как я это делаю. Это установит часовой пояс PHP по умолчанию на местный часовой пояс пользователя. Просто вставьте следующее в верхней части всех ваших страниц:
источник
Попробуйте этот код PHP:
источник