Как найти идентификатор временной зоны с IP-адреса / названия страны в PHP?

Может кто-нибудь, пожалуйста, скажите мне, есть ли какой-либо способ, доступный в PHP, для получения региона часового пояса, например («Азия / Калькутта») с IP-адреса или названия страны?

Описание:

Я пытаюсь установить часовой пояс пользователя на основе его / ее страны. Я получаю пользовательскую страну от его IP-адреса, но мне нужен часовой пояс в этой стране, например («Азия / Калькутта»), чтобы проверить, включен ли DST в этой стране. Может кто-нибудь, пожалуйста, предоставит мне подходящее решение на PHP?

Использование IP-адреса

Временные интервалы следуют иногда изворотливым правилам. IP-геолокация не является чем-то конкретным (несмотря на претензии некоторых поставщиков).

Сказав это, вы, безусловно, можете найти город и страну, используя продукт Geo IP, такой как MaxMind's:

http://www.maxmind.com/app/geolite

который включает в себя модуль PHP

http://www.maxmind.com/app/php

Затем вы можете использовать API MaxMind, чтобы попытаться оценить часовой пояс пользователя

http://www.maxmind.com/app/faq#timezone

альтернатива

Если вы хотите полагаться на часы пользователя, а не на IP-адрес, jsTimezoneDetect работает достаточно хорошо (хотя это не идеально).

https://bitbucket.org/pellepim/jstimezonedetect/wiki/Home

Резюме

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

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

Одна простая возможность – спросить пользователя, но это легко.

С помощью JavaScript вы можете узнать смещение в минутах от UTC. Также вы можете узнать, находится ли клиент в стране с летним временем (DST) и если dst активен. Это можно сделать, сравнивая время двух объектов даты: одно с месяцем January и с месяцем July .

 var dst1, dst2, expires, hemisphere, now; now = new Date(); expires = new Date(); dst1 = new Date(); dst2 = new Date(); expires.setTime(now.getTime() + 31536000000); setCookie('timezone_offset', now.getTimezoneOffset(), expires, '/'); dst1.setDate(1); dst1.setMonth(1); dst2.setDate(1); dst2.setMonth(7); if (parseInt(dst1.getTimezoneOffset()) === parseInt(dst2.getTimeZoneOffset())) { setCookie('timezone_dst', 0, expires, '/'); } else { hemisphere = parseInt(d1.getTimezoneOffset()) - parseInt(d2.getTimezoneOffset()); if ((hemisphere > 0 && parseInt(d1.getTimezoneOffset()) === parseInt(now.getTimezoneOffset())) || (hemisphere < 0 && parseInt(d2.getTimezoneOffset()) === parseInt(now.getTimezoneOffset()))) { setCookie('timezone_dst', '0', expires, '/'); } else { setCookie('timezone_dst', '1', expires, '/'); } } 

Прочитайте файл cookie с PHP и интерпретируйте информацию о них с помощью timezone_name_from_abbr () :

 $timezone = timezone_name_from_abbr('', $_COOKIE['timezone_offset'] * 60, $_COOKIE['timezone_dst']); 

Если вы хотите сделать это на стороне сервера, вы можете сделать это с помощью PHP:

 $url = "https://ipsidekick.com/json"; $result = file_get_contents($url); $json = json_decode($result, true); print("It's " . $json["gmtOffset"] . " at " . $json["timeZoneName"]); 

Обратите внимание, что это синхронно.

Кроме того, если вы можете сделать это на стороне клиента. Вы можете использовать это с jQuery или эквивалентом:

 $.get("https://ipsidekick.com/json", function(response) { console.log(response.ip + " It's " + response.gmtOffset + " from " + response.timeZoneName); }); 

Отказ от ответственности: я запускаю IP Sidekick .