Можете ли вы определить часовой пояс из переменных запроса?

Есть ли способ сделать ваши смещения в часовом поясе на стороне сервера, прочитав что-то в запросе через 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;
    }

Спасибо...