Я пишу приложение с использованием 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
отправленном клиентом.