Наиболее популярный (стандартный) способ это узнать — спросить об этом пользователя. Для зарегистрированных пользователей можно предоставить возможность редактирование этой информации в настройках его профиля (или сразу при регистрации). Для анонимных пользователей можно считать, что он находится на UTC+0, если разброс часовых поясов у Ваших пользователей большой. Или, если посетителей приходит больше с одного региона, то принять по-умолчанию пояс этого региона.
Я не хочу показаться умником, я просто веду к тому, что иногда лучшее решение проблемы лежит за пределами программного контекста. К тому же, мне сложно представить ситуацию, в которой часовой пояс пользователя будет иметь какое-нибудь важное значение.
Что если сделать так:
x = new Date(); // Вычислим значение смещения текущего часового пояса в часах currentTimeZoneOffsetInHours = -x.getTimezoneOffset()/60;
Функция getTimezoneOffset() возвращает разницу в минутах между временем по UTC и местным временем пользователя. Если пользователь находится, например, в UTC+10, то этот метод вернёт -600. Разделим это значение на 60 и поменяем знак на минус, чтобы узнать, в каком поясе находится пользователь. Полученную информацию можно отправить на сервер. Я не эксперт, но минусов такого подхода я не вижу. Разве что та ситуация, когда у пользователя отключён JavaScript. Но по другому, наверное, никак.
Что-то в этом роде (возможно, надо будет доработать):
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'']; ?>