Как определить часовой пояс пользователя? [Дубликат]

25
задан Community 23 May 2017 в 12:26
поделиться

5 ответов

Чтобы подвести итог ответа Мэтта Джонсона в терминах кода:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.
    $.post("url-to-function-that-handles-time-zone", {tz: timezone}, function(data) {
       //Preocess the timezone in the controller function and get
       //the confirmation value here. On success, refresh the page.
     });
  });
</script>
34
ответ дан halfer 23 May 2017 в 12:26
поделиться

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

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

Есть несколько стратегий, которые вы можете использовать для определения часового пояса, например, использование библиотеки jsTimeZoneDetect , которая является отличной отправной точкой, но достаточно несовершенна, чтобы вы не могли полагаться только на нее , Если вы используете moment.js, в моментной зоне есть встроенная функция moment.tz.guess(), которая делает то же самое.

Идея использования JavaScript-функции getTimezoneOffset() ошибочна в том, что вы не получаете часовой пояс - только одно смещение для конкретной даты. См. раздел вики-тега TimeZone под названием «TimeZone! = Offset».

Как ни крути, в конечном итоге вам нужно выбрать один из двух подходов:

ИЛИ

  • Отправлять время в браузер только в формате UTC и использовать JavaScript в браузере для преобразования в любой часовой пояс, для которого пользователь может настроить свой компьютер.

Я обсуждаю это более подробно (с точки зрения c #) в этот ответ .

23
ответ дан Community 23 May 2017 в 12:26
поделиться

Зависимости:

  1. http://www.maxmind.com/download/geoip/api/php/php-latest.tar.gz
  2. http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

    //Get remote IP
    $ip = 

    Зависимости:

    1. http://www.maxmind.com/download/geoip/api/php/php-latest.tar.gz
    2. http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

      [110]

    цитата: SGet локальное время посетителя, время восхода и захода по IP с MaxMind GeoIP и PHP от Станислава Хромова

    SERVER['REMOTE_ADDR']; //Open GeoIP database and query our IP $gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD); $record = geoip_record_by_addr($gi, $ip); //If we for some reason didnt find data about the IP, default to a preset location. if(!isset($record)) { $record = new geoiprecord(); $record->latitude = 59.2; $record->longitude = 17.8167; $record->country_code = 'SE'; $record->region = 26; } //Calculate the timezone and local time try { //Create timezone $user_timezone = new DateTimeZone(get_time_zone($record->country_code, ($record->region!='') ? $record->region : 0)); //Create local time $user_localtime = new DateTime("now", $user_timezone); $user_timezone_offset = $user_localtime->getOffset(); } //Timezone and/or local time detection failed catch(Exception $e) { $user_timezone_offset = 7200; $user_localtime = new DateTime("now"); } echo 'User local time: ' . $user_localtime->format('H:i:s') . '<br/>'; echo 'Timezone GMT offset: ' . $user_timezone_offset . '<br/>';

цитата: SGet локальное время посетителя, время восхода и захода по IP с MaxMind GeoIP и PHP от Станислава Хромова

2
ответ дан davidcondrey 23 May 2017 в 12:26
поделиться

Это прекрасно работает ...

  echo <<<EOE
   <script type="text/javascript">
     if (navigator.cookieEnabled)
       document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
   </script>
EOE;
  if (!isset(

Это прекрасно работает ...

[110]COOKIE['tzo'])) { echo <<<EOE <script type="text/javascript"> if (navigator.cookieEnabled) document.reload(); else alert("Cookies must be enabled!"); </script> EOE; die(); } $ts = new DateTime('now', new DateTimeZone('GMT')); $ts->add(DateInterval::createFromDateString(

Это прекрасно работает ...

[110]COOKIE['tzo'].' minutes'));
0
ответ дан Bernhard Lauber 23 May 2017 в 12:26
поделиться

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

0
ответ дан Antony 23 May 2017 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: