代码之家  ›  专栏  ›  技术社区  ›  DevelopingChris

你能从请求变量中确定时区吗?

  •  27
  • DevelopingChris  · 技术社区  · 16 年前

    有没有一种方法可以在服务器端进行时区偏移,即通过HTTP读取请求中的内容,而不是将所有内容发送给客户机并让其处理?

    5 回复  |  直到 8 年前
        1
  •  21
  •   devstuff    16 年前

    这更复杂,但我以前不得不求助于这个场景,因为机器和用户配置文件设置有时与访客的偏好不匹配。例如,一个英国访问者从澳大利亚服务器临时访问您的站点。

    1. 使用@balabaster建议的地理定位服务(例如maxmind.com),以获得与其IP匹配的区域(global.session_start是最好的)。这对本地的ISP来说是一个很好的匹配,但对AOL却不是那么好。将与此的偏移量存储在会话cookie中。

    2. 或者在用户进入站点时,使用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>
      
    3. 允许访问者通过持久cookie(匿名用户)和帐户配置文件中的字段(如果已验证)更新区域。

    来自的持久值3覆盖会话值。您还可以为经过身份验证的用户存储相同的持久cookie,以便在用户登录之前显示时间。

        2
  •  5
  •   Bozho    13 年前

    检查 detect_timezone.js -确定用户的时区是否做得很好?

        3
  •  0
  •   BenAlabaster    16 年前

    在页面卸载…request.servervariables之前的任何事件中。如果您想要他们的物理时区,那么您可以检查他们的IP地址并使用IP到地理位置转换工具。

    我不确定是否还有其他方法可以做到这一点,因此如果您需要为其计算机配置时区,则必须等待javascript的页面加载…

        4
  •  0
  •   Community CDub    8 年前

    有没有办法在服务器端进行时区偏移,通过 通过HTTP读取请求中的内容,而不是发送 把一切都交给客户,让他们来处理?

    以下是我在使用WCF Web服务时提出的解决方案:

    How to get a WCF Web Service to return DateTimes in user's local timezone

    基本上,我使用javascript/angular代码来确定用户的时区,然后将该值传递给我的一个wcf web服务。

    注意我如何使用一个名为 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;
        });
    }
    

    从那里,我的C代码读取数据库记录,将该时区偏移应用于UTC DateTime 值,并将其返回给客户端。

        5
  •  -1
  •   Kiran    10 年前

    我们可以在服务器端使用下面的代码来获取时区,而不是从客户机发送值。

    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;
        }
    

    谢谢。。。