2008-12-03 27 views

回答

21

这比较复杂,但之前我不得不诉诸于这种情况,因为机器和用户配置文件设置有时不符合访问者的偏好。例如,英国访问者从澳大利亚服务器临时访问您的网站。

  1. 使用地理定位服务,通过@balabaster建议(例如MaxMind.com),让他们匹配的IP区(Global.Session_Start是最好的)。这对当地的互联网服务提供商来说非常适合,但对美国在线来说并不是那么好。将此偏移量存储在会话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以显示时间。

0

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

我不知道是否有另一种方式,你可以做到这一点,所以如果你需要他们的计算机配置的时区,那就要等待一个JavaScript的网页加载...

+2

谢谢你创造了我今天听到的最长版本。 – DevelopingChris 2008-12-03 20:01:48

+0

我曾经想知道,为什么我在挪威奥斯陆获得本地化广告时,每次我用手机上的Opera Mini浏览网络时,我都意识到这是由IP导致的地理位置转换引起的......这恰好是奥斯陆是几个时区远离我住的地方:-) – Kaniu 2008-12-03 20:11:16

+0

ChanChan:您可以随时指望我; – BenAlabaster 2008-12-04 04:01:48

5

检查detect_timezone.js - 做了不错的工作,确定用户的时区

+0

我特别寻找服务器端解决方案,以便我可以在基于时区的缓存代码中实际执行某些操作。这与我最终使用的解决方案类似,并且使后端代码不在意,但将偏移作为客户端请求的一部分很好。 – DevelopingChris 2011-07-22 14:53:09

-1

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

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

谢谢...

0

有没有办法做到在服务器端你的时区偏移,通过 读通过HTTP请求的东西,而不是发送 一切客户端和让它处理它?

这是我想出了一个解决方案,当我与WCF Web服务的同一个问题:

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

基本上,我得到我的JavaScript /角码,以确定用户的时区,然后将此值传递给我的其中一个WCF Web服务。

请注意,我有一个名为getListOfRecords的Web服务,它带有一个参数,即时区偏移值。

$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值,并将其返回给客户端。

相关问题