Как определить часовой пояс пользователя?

Вопрос

Есть ли какой-нибудь стандартный способ получить на веб-сервере информацию о том, какой часовой пояс у пользователя? Есть ли такая JavaScript-функция, если нет, то может быть эта информация есть в HTTP-заголовках или описании user-agent в браузере, например. Или же вычислить часовой информацию по IP.

Ответ №1

Наиболее популярный (стандартный) способ это узнать — спросить об этом пользователя. Для зарегистрированных пользователей можно предоставить возможность редактирование этой информации в настройках его профиля (или сразу при регистрации). Для анонимных пользователей можно считать, что он находится на UTC+0, если разброс часовых поясов у Ваших пользователей большой. Или, если посетителей приходит больше с одного региона, то принять по-умолчанию пояс этого региона.

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

Ответ №2

Что если сделать так:

x = new Date();
// Вычислим значение смещения текущего часового пояса в часах
currentTimeZoneOffsetInHours = -x.getTimezoneOffset()/60;

Функция getTimezoneOffset() возвращает разницу в минутах между временем по UTC и местным временем пользователя. Если пользователь находится, например, в UTC+10, то этот метод вернёт -600. Разделим это значение на 60 и поменяем знак на минус, чтобы узнать, в каком поясе находится пользователь. Полученную информацию можно отправить на сервер. Я не эксперт, но минусов такого подхода я не вижу. Разве что та ситуация, когда у пользователя отключён JavaScript. Но по другому, наверное, никак.

Ответ №3

Что-то в этом роде (возможно, надо будет доработать):
timezone.js:

function ajaxpage(){
var url = "timezone.php";
var visitortime = new Date();
vat time = visitortime.getTimezoneOffset()/60;
var page_request = false
if (window.XMLHttpRequest)
page_request = new XMLHttpRequest()
else if (window.ActiveXObject){
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
} catch (e){
try{
page_request = new ActiveXObject("Microsoft.XMLHTTP")
} catch (e) {}
}
} else
return false

page_request.onreadystatechange=function() {
loadpage(page_request, containerid)
}

if (bustcachevar)
bustcacheparameter=(url.indexOf("?")!=-1) ? "&"+new Date().getTime() : "?"+new Date().getTime()

page_request.open(''GET'', url+bustcacheparameter+"&time="+time, true)
page_request.send(null) }


function loadpage(page_request, containerid){
if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1))
document.write(''<meta http-equiv="refresh" content="0;url=http://example.com/"/>'');
}

timezone.php:

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

No responses yet

Добавить комментарий