Как получить часовую зону клиента?
Я пишу приложение с использованием Zend_Framework (поэтому решение может положиться на него).
Как получить часовую зону клиента?
Например, если кто-то из Москвы, России, я хочу получить 3 * 60 * 60 (потому что есть UTC + 3). Если он в Великобритании, я хочу ноль. Если он использует UTC-3: 30 (Канада?), Я хочу -3,5 * 60 * 60.
(это не вопрос о формате - я в порядке с получением "Европа/Москва" или "UTC-3" для Санкт-Петербурга, Россия, скорее о том, чтобы использовать клиентскую зону в часовом поясе. Но предпочтительнее дельта за секунды )
Единственное решение, которое приходит на ум, - дать javascript получить локальное время для меня и перенаправить.
Ответы
Ответ 1
Отметьте эту статью о том, как определить часовой пояс, установив Cookie через JavaScript, который будет содержать часовой пояс клиента. Это довольно долго, но это потому, что это довольно многословие. Я реализовал решение по этим направлениям в одном из своих приложений, и он работает очень хорошо.
Вы также можете отправить часовой пояс через Ajax на сервер и заставить его делать то, что вам нужно сделать с этим. Или, если вы не проводите с ним никаких расчетов с серверами, просто примените клиентскую сторону часового пояса там, где это необходимо. Действительно зависит от вашего использования.
В дополнение к этому, я предлагаю вам позволить посетителю самому установить часовую зону и сохранить это в Cookie или сеансе.
Ответ 2
Я написал функцию, использующую 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) или любой часовой пояс, в котором вы находитесь.
Ответ 3
Это решение для файлов 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'));
Ответ 4
Я думаю, что ваш лучший выбор - угадать, основываясь на заголовке Accept-Language
, отправленном клиентом.