Разница в часовых поясах браузера и IP-адресе

Обновлено: 21.11.2024

Метод getTimezoneOffset() возвращает разницу в минутах между датой, вычисленной в часовом поясе UTC, и той же датой, вычисленной в местном часовом поясе.

Попробуйте

Синтаксис

Возвращаемое значение

Разница в минутах между датой, рассчитанной в часовом поясе UTC и рассчитанной в местном часовом поясе.

Описание

date.getTimezoneOffset() возвращает разницу в минутах между датой в соответствии с часовым поясом UTC и датой в соответствии с местным часовым поясом. это часовой пояс хост-системы, в которой используется браузер (если код запускается из Интернета в браузере), или, в противном случае, хост-система любой среды выполнения JavaScript (например, среда Node.js), в которой код выполняется в.

Отрицательные и положительные значения

Количество минут, возвращаемое функцией getTimezoneOffset(), является положительным, если местный часовой пояс отстает от UTC, и отрицательным, если местный часовой пояс опережает UTC. Например, для UTC+10 будет возвращено -600.

< th scope="col">UTC+3
Текущий часовой пояс UTC-8 UTC
Возвращаемое значение 480 0 -180

Разные результаты в часовых поясах с переходом на летнее время

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

Рассмотрите заданный местный часовой пояс и дату date1, которые оба относятся к летнему времени, и рассмотрите минуты, количество минут, возвращаемое вызовом date1.getTimezoneOffset() ; затем:

  • Если в местном часовом поясе сейчас летнее время, но для заданной даты date2 не летнее время, то число минут, возвращаемое функцией date2.getTimezoneOffset(), равно минут ± 60.
  • Если местный часовой пояс не в настоящее время находится в летнее время, но заданная дата date3 находится в летнее время, то количество минут, возвращаемое date3.getTimezoneOffset(), равно минут ± 60.

В часовом поясе, который ежегодно не переходит на летнее время (DST), количество минут, возвращаемое вызовом getTimezoneOffset(), всегда возвращает одно и то же количество минут, независимо от даты< /em> экземпляр, из которого он вызывается.

Примечание. Приведенное выше описание является упрощением. В реализациях база данных часовых поясов IANA (tzdata) используется для точного определения влияния летнего времени на расчет разницы часовых поясов.

Некоторые сайты, на которых я просматриваю и регистрирую учетную запись, могут определить мое местоположение по «часовому поясу», установленному в Windows, я использую Chrome, так как я могу заблокировать их доступ к реальному часовому поясу?

Редактировать: извините, забыл упомянуть, что я использую VPN с британским IP-адресом, поэтому до недавнего времени я всегда бродил по Интернету, как англичанин, до недавнего времени я обнаружил, что некоторые сайты могут знать ваше фактическое местоположение по вашему часовому поясу.

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

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

Как они могут найти вас по часовому поясу? в самом общем виде это 24 куска земли, это огромно.

-1 для QA, +1 для @barlop . что за двойка? часовой пояс в окнах влияет на серфинг? они получают это от вашего IP-геолокации на самом деле. попробуйте использовать прокси из другой страны.

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

2 ответа 2

Получить часовой пояс вашей системы, установленный в ОС, довольно просто с помощью JavaScript в браузере. Введите их в адрес/адрес:

Первый показывает текущее время в вашем часовом поясе, обычно со смещением часового пояса и названием, например "GMT-400 (EDT)". Если это слишком много синтаксического анализа и математики, второй показывает минуты от UTC. Таким образом, если JavaScript включен, сайт может получить это значение и вставить его в поле, которое отправляется в форме, или просто отправить эту информацию обратно на сервер в любое время.

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

(И в настоящее время используется 40 часовых поясов, а не 24 — некоторые начинаются с 30 и 45 минут первого часа от UTC, а некоторые в Тихом океане перекрываются на день.)

EDIT: в дополнение к часовому поясу вы также можете получить свою локаль через объекты даты и числа: порядок и разделитель для года, месяца и дня; и разделители тысяч и десятичных знаков. Некоторые их комбинации могут, в некоторых случаях, обеспечить точное местоположение для страны (или даже немного лучше — было бы интересно увидеть матрицу всех комбинаций).

Даже если бы вы могли просто заглушить дату и число, это, вероятно, нарушило бы некоторые полезные функции. Таким образом, лучшим подходом было бы изменить объект prototypes так, чтобы он лгал и использовал произвольно выбранный часовой пояс и регион. Однако это потребует изрядной работы над Date; есть несколько родственных методов. Например, чтобы настроить GMT:

Как предполагает @barlop, похоже, что вы можете использовать фильтры Privoxy для изменения страниц до того, как они попадут в ваш браузер. Из-за (1) того, как поиск и замена работают с Privoxy, (2) требований патча и (3) гибкости HTML: вам придется применять патч в начале как и (и даже это не 100% покрытие).

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

Хотите показать уникальное продвижение? Хотите изменить язык своего сайта или дизайн в зависимости от того, откуда приходят ваши пользователи?

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

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

Предпосылки

Параметры определения местоположения

Есть два очень популярных способа определить местоположение пользователя непосредственно в браузере:

  1. Использование API геолокации
  2. Поиск IP-адреса

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

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

Чтобы использовать API геолокации, вы можете сделать следующее:

Сначала проверяется наличие/поддержка API геолокации в браузере. Если это так, он выполняет остальную часть кода, которая включает функцию обратного вызова успеха и ошибки. navigator.geolocation.getCurrentPosition(success, error) дает вам точные координаты пользователя, которые вы можете ввести в карты Google, чтобы получить точное местоположение пользователя.

Вы можете отправить запрос в API обратного геокодирования Google. Для этого потребуется получить ключ API.

Мы сделали специальное демо для .
Нет, правда. Нажмите здесь, чтобы проверить это .

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

Вот простой поиск:

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

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

Вот список других мест, которые можно проверить при поиске IP-адресов:

Помните, что поиск по IP в основном дает точную информацию о стране и часовом поясе исходного запроса. Город может быть местоположением вашего интернет-провайдера. Если вы хотите получить точный город или регион пользователя, вам следует использовать API геолокации и найти способы убедить пользователя поделиться с вами своим местоположением.

Получение местного часового пояса пользователей в JavaScript

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

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

Часовой пояс момента

Moment Timezone имеет функцию, которая угадывает часовой пояс пользователя. Это достаточно точно, если вы используете самую последнюю версию.

Ниже приведен краткий пример того, как это работает:

Когда вы загружаете страницу, она показывает ваш текущий часовой пояс. Создайте файл index.html и откройте его в браузере. Скопируйте приведенный выше код в файл и сохраните его. Затем обновите только что открытую вкладку браузера. Круто, правда?

MomentTz использует Intl API, который является встроенным API интернационализации JavaScript. У него также есть свой банк данных, по которому он проверяет результаты Intl API, чтобы предоставить более точную информацию. Также требуется, чтобы вы включили Moment.js, прежде чем он сможет работать.

Пакет Jstz

Jstz — это простой и легкий пакет для определения часового пояса. Я говорю легче по сравнению с Moment.js. Он также использует Intl API, так что вы можете быть уверены в его результатах. Чтобы использовать пакет, вы можете получить CDN следующим образом:

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

Сам международный API

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

Хорошо, вот как это использовать:

Прежде чем вы скажете: «Вау. », поймите, что пакеты, выделенные выше, учитывают многое при определении часовых поясов. Это делает их немного более точными, чем только Intl API. Возможно, вы никогда не заметите разницы, но приятно знать, что кто-то прикрывает вашу спину.

Волшебное приложение

«Разговоры дешевы. Покажи мне код». или так говорится. Давайте пойдем еще дальше и создадим действительно простое приложение, которое определяет местоположение пользователя и информацию о часовом поясе, а также сообщает ему, какое время будет в трех других часовых поясах по всему миру.

Вот как выглядит простое приложение:

Вот как мы объединили код для достижения этой цели: поместите его в файл с именем index.html

Создайте файл index.css и добавьте следующее:

Возможно, это самое простое приложение, которое вы когда-либо видели. Мы не делаем ничего необычного, просто переходим к делу. Стандартный HTML и CSS, вот и все.

Теперь давайте добавим JavaScript, который воплотит все это в жизнь: добавьте следующее в index.html

Мы заложили основу для будущего. Первое, что мы хотим сделать, это определить, поддерживает ли браузер Geolocation API:

Теперь мы можем выполнить наш код, если API геолокации доступен/доступен. Если это не так, мы просто возвращаемся к поиску IP, как мы видели выше.

Давайте создадим методы success , error и ipLookup:

Выше мы уже видели, как они работают, поэтому я не буду объяснять, что они делают. Теперь добавим метод reverseGeocodingWithGoogle:

Возможно, вы заметили, что я представил две новые функции: processUserData и fallbackProcess. Это просто для того, чтобы вещи оставались чистыми и пригодными для повторного использования. Теперь добавим их обоих:

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

Теперь давайте определим часовой пояс:

На этом наше волшебное приложение завершено. Вот ссылка на проект на codepen.

Определение часового пояса и местоположения в JavaScript

Заключение

Надеюсь, эта статья была вам полезна. Я надеюсь, что это поможет вам улучшить взаимодействие с пользователем и создать более интернациональное приложение с помощью JavaScript.

И последнее, что может пригодиться, — это получить строку DateTime в определенном часовом поясе с помощью JavaScript. Не волнуйся, я тебя понял. Вот простая строка кода, которая вам нужна:

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

LogRocket: легче отлаживать ошибки JavaScript благодаря пониманию контекста

Отладка кода всегда утомительна. Но чем лучше вы понимаете свои ошибки, тем легче их исправить.

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

LogRocket записывает журналы консоли, время загрузки страниц, трассировку стека, медленные сетевые запросы и ответы с заголовками и телами, метаданными браузера и пользовательскими журналами. Понимание влияния вашего кода JavaScript никогда не будет таким простым!

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

Часовой пояс – это набор правил, определяющих смещение UTC для разных времен года в конкретном местоположении. Из-за перехода на летнее время определенное место может иметь два (или более) разных смещения UTC в зависимости от того, в какой момент времени вы на него смотрите. В некоторых областях в прошлом могли действовать разные правила, даже в одной и той же стране. Примером может служить Китай, где сейчас есть только один часовой пояс, а раньше их было несколько. Таким образом, существуют разные часовые пояса для разных мест в Китае, хотя текущее смещение UTC одинаково для всех них. Часовые пояса определяются по стране/городу или стране/подстране/городу.

Предложение MaxMind позволяет связать комбинацию страны/региона с идентификатором часового пояса. Для США это даже подразделяется на штат. Однако не учитываются часовые пояса России, Австралии и даже штата Индиана, США.

IP2Location обеспечивает только одно смещение UTC для каждого диапазона IP-адресов, полностью игнорируя летнее время.

Я не могу получить доступ к решению Hostip.info, потому что phpclasses требует какой-то глупой регистрации.

Что касается собственного решения автора, использующего JavaScript, то оно также частично ошибочно. В его примере JavaScript возвращает только смещение UTC. К счастью, определить правильный часовой пояс можно немного лучше, используя некоторые функции PHP. Следующий фрагмент кода использует как смещение UTC, так и аббревиатуру часового пояса, чтобы узнать часовой пояс пользователя:

Конечно, это все еще не идеально, потому что, например, это дало бы тот же результат для большей части Европы (Европа/Берлин).

Читайте также: