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

Вопрос

Есть ли какой-нибудь стандартный способ получить на веб-сервере информацию о том, какой часовой пояс у пользователя? Есть ли такая 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'];
?>

Нет комментариев

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


(обязательно)