Можете ли вы определить часовой пояс из переменных запроса?
Есть ли способ сделать ваши смещения в часовом поясе на стороне сервера, прочитав что-то в запросе через http, вместо того, чтобы отправлять все клиенту и разрешать ему иметь дело с ним?
Ответы
Ответ 1
Это сложнее, но мне приходилось прибегать к этому сценарию раньше, потому что настройки параметров машины и профиля иногда не соответствуют предпочтениям вашего посетителя. Например, посетитель Великобритании временно посещает ваш сайт с австралийского сервера.
-
Используйте службу геолокации (например, MaxMind.com), как было предложено @balabaster, чтобы получить зону, соответствующую их IP (лучше всего подходит Global.Session_Start). Это хорошее совпадение для локальных интернет-провайдеров, но это не так хорошо для AOL. Храните смещение от этого в файле cookie сеанса.
-
Или используйте JavaScript, чтобы получить смещение часового пояса как часть отправки/перенаправления формы, когда пользователь входит на сайт. Это текущее смещение браузера, но не обязательно предпочтительная зона для посетителей. Используйте это значение по умолчанию; сохранить в другом сеансе cookie.
<script type="text/javascript" language="JavaScript">
var offset = new Date();
document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>');
</script>
-
Разрешить посетителю обновлять зону через постоянный файл cookie (для анонимных пользователей) и поле в своем профиле учетной записи (если оно завершено).
Постоянное значение # 3 переопределяет значения сеанса. Вы также можете сохранить тот же постоянный файл cookie для аутентифицированных пользователей для отображения времени до входа в систему.
Ответ 2
Проверить detect_timezone.js - довольно хорошая работа, определяющая часовой пояс пользователя
Ответ 3
В любом из событий, предшествующих странице Unload... Request.ServerVariables. Если вы хотите их физический часовой пояс, то вы проверяете их IP-адрес и используете инструмент преобразования IP-адресов в Geo-Location.
Я не уверен, есть ли другой способ сделать это, поэтому, если вам нужен часовой пояс, на который настроен их компьютер, ему придется ждать загрузки страницы для javascript...
Ответ 4
Есть ли способ сделать ваши смещения часового пояса на стороне сервера, чтение чего-то в запросе через http, вместо отправки все для клиента и позволить ему справиться с этим?
Вот решение, с которым я столкнулся, когда у меня была такая же проблема с веб-службами WCF:
Как получить веб-службу WCF для возврата DateTimes в пользовательский локальный часовой пояс
В принципе, я получаю код JavaScript/ Angular, чтобы определить часовой пояс пользователя, затем передайте это значение в одну из моих веб-служб WCF.
Обратите внимание, что у меня есть веб-служба под названием getListOfRecords
, которая принимает один параметр, значение смещения часового пояса.
$scope.loadSomeDatabaseRecords = function () {
var d = new Date()
var timezoneOffset = d.getTimezoneOffset();
return $http({
url: 'http://localhost:15021/Service1.svc/getListOfRecords/' + timezoneOffset,
method: 'GET',
async: true,
cache: false,
headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' }
}).success(function (data) {
$scope.listScheduleLog = data.Results;
});
}
Оттуда мой код С# читает в записях базы данных, применяет это временное смещение к значениям UTC DateTime
и возвращает его клиенту.
Ответ 5
Мы можем получить часовой пояс, используя приведенный ниже код на стороне сервера, вместо отправки значения от клиента.
private TimeZoneInfo GetRequestTimeZone()
{
TimeZoneInfo timeZoneInfo = null;
DateTimeOffset localDateOffset;
try
{
localDateOffset = new DateTimeOffset(Request.RequestContext.HttpContext.Timestamp, Request.RequestContext.HttpContext.Timestamp - Request.RequestContext.HttpContext.Timestamp.ToUniversalTime());
timeZoneInfo = (from x in TimeZoneInfo.GetSystemTimeZones()
where x.BaseUtcOffset == localDateOffset.Offset
select x).FirstOrDefault();
}
catch (Exception)
{
}
return timeZoneInfo;
}
Спасибо...