Как получить часовой пояс клиента?

Я пишу приложение с использованием Zend_Framework (поэтому решение может положиться на него).

Как получить часовой пояс клиента?

Например, если кто-то из Москвы, России, я хочу получить 3 * 60 * 60 (потому что есть UTC + 3). Если он в Великобритании, я хочу ноль. Если он использует UTC-3: 30 (Канада?), Я хочу -3,5 * 60 * 60.

(речь идет не о формате – я в порядке с получением «Европа / Москва» или «UTC-3» для Санкт-Петербурга, Россия, скорее, это использование клиентом часового пояса, но предпочтительнее дельта за секунды)

Единственное решение, которое приходит на ум, – дать javascript получить локальное время для меня и перенаправить.

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

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

В дополнение к этому, я предлагаю вам позволить посетителю самому установить часовую зону и сохранить это в Cookie или сеансе.

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

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

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

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

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

Это решение для файлов cookie с очень небольшими накладными расходами:

  echo <<<EOE <script type="text/javascript"> if (navigator.cookieEnabled) document.cookie = "tzo="+ (- new Date().getTimezoneOffset()); </script> EOE; if (!isset($_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($_COOKIE['tzo'].' minutes')); 

Я думаю, ваш лучший выбор – угадать, основываясь на заголовке Accept-Language отправленном клиентом.