Asp.net 您能从请求变量确定时区吗?

Asp.net 您能从请求变量确定时区吗?,asp.net,datetime,.net-3.5,timezone,globalization,Asp.net,Datetime,.net 3.5,Timezone,Globalization,有没有一种方法可以在服务器端进行时区偏移,通过http读取请求中的某些内容,而不是将所有内容发送给客户端并让其处理?在页面卸载之前的任何事件中…request.ServerVariables。如果您想要他们的物理时区,那么您可以检查他们的IP地址,并使用IP到地理位置转换工具 我不确定是否有其他方法可以做到这一点,因此,如果您需要他们的计算机配置的时区,它将不得不等待页面加载javascript…这更复杂,但我以前不得不求助于这种情况,因为机器和用户配置文件设置有时与访问者的首选项不匹配。例如,

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

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


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

这更复杂,但我以前不得不求助于这种情况,因为机器和用户配置文件设置有时与访问者的首选项不匹配。例如,一名英国访问者从澳大利亚服务器临时访问您的站点

  • 按照@balabaster的建议,使用地理定位服务(例如MaxMind.com),以获得与其IP匹配的区域(Global.Session\u Start是最好的)。这对本地ISP来说是一个很好的匹配,但对AOL来说不是很好。将此偏移量存储在会话cookie中

  • 
    <script type="text/javascript" language="JavaScript">
    var offset = new Date();
    document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>');
    </script>
    
  • 或者在用户进入站点时,使用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>
    
    
    var offset=新日期();
    文件。写(“”);
    
  • 允许访问者通过持久cookie(针对匿名用户)和帐户配置文件中的字段(如果经过身份验证)更新区域


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

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

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

    有没有办法在服务器端通过 通过http读取请求中的内容,而不是发送 一切都交给客户,让客户自己处理

    当我遇到与WCF web服务相同的问题时,我提出了以下解决方案:

    基本上,我获取JavaScript/Angular代码来确定用户的时区,然后将该值传递给我的一个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
    值,并将其返回给客户端。

    下面是我如何使用javascript和MVC解决它的:

    首先,在主站点脚本上,我添加了以下代码:

    var clientOffset = getCookie("_clientOffset");
    var currentOffset = new Date().getTimezoneOffset() * -1;
    var reloadForCookieRefresh = false;
    
    if (clientOffset  == undefined || clientOffset == null || clientOffset != currentOffset) {
        setCookie("_clientOffset", currentOffset, 30);
        reloadForCookieRefresh = true;
    }
    
    if (reloadForCookieRefresh)
        window.location.reload();
    
    function setCookie(name, value, days) {
        var expires = "";
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toUTCString();
        }
        document.cookie = name + "=" + (value || "") + expires + "; path=/";
    }
    
    function getCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }
    
    var clientOffset=getCookie(“_clientOffset”);
    var currentOffset=new Date().getTimezoneOffset()*-1;
    var reloadforCookiierefresh=false;
    如果(clientOffset==undefined | | clientOffset==null | | clientOffset!=currentOffset){
    setCookie(“_clientOffset”,currentOffset,30);
    RELOADFORCOOKEIEREFRESH=真;
    }
    if(重新加载ForCookiierefresh)
    window.location.reload();
    函数setCookie(名称、值、天数){
    var=”;
    如果(天){
    变量日期=新日期();
    date.setTime(date.getTime()+(天*24*60*60*1000));
    expires=“;expires=“+date.toutString();
    }
    document.cookie=name+“=”+(值| |“”)+expires+“path=/”;
    }
    函数getCookie(名称){
    变量nameEQ=name+“=”;
    var ca=document.cookie.split(“;”);
    对于(变量i=0;i
    在操作筛选器内的服务器端:

    public class SetCurrentRequestDataFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            // currentRequestService is registered by request using IoC container
            var currentRequestService = iocResolver.Resolve<ICurrentRequestService>();
    
            if (context.HttpContext.Request.Cookies.AllKeys.Contains("_clientOffset"))
            {
                currentRequestService.ClientOffset = int.Parse(context.HttpContext.Request.Cookies.Get("_clientOffset").Value);
            }
    
        }
    }
    
    公共类SetCurrentRequestDataFilter:ActionFilterAttribute
    {
    公共重写无效OnActionExecuting(ActionExecutingContext上下文)
    {
    //currentRequestService是通过使用IoC容器的请求注册的
    var currentRequestService=iocResolver.Resolve();
    if(context.HttpContext.Request.Cookies.AllKeys.Contains(“\u clientOffset”))
    {
    currentRequestService.ClientOffset=int.Parse(context.HttpContext.Request.Cookies.Get(“\u ClientOffset”).Value);
    }
    }
    }
    
    感谢您创建了我今天听到的最长版本的No。我曾经想知道为什么每次我用手机上的Opera Mini上网时都会收到挪威奥斯陆的本地化广告,直到我意识到这是由IP到地理位置转换引起的。。。碰巧奥斯陆离我住的地方有两个时区:-)ChanChan:你可以一直相信我;)您是否已在设置为UTC的服务器和设置为实际时区的客户端上尝试过此操作。您吸引了我足够多的时间来测试此操作,但很抱歉。去钓鱼吧。有趣的概念。如果浏览器在默认情况下只发送带有请求头的本地时间。这似乎只是确定服务器时区的一种迂回方式,可以更简单地完成。我遇到了另一个问题,这使问题更加复杂。这是如何处理我的夏令时时区中明年12月的返回日期的。如果它只使用偏移量,那么许多时区是匹配的,而且大多数时区不使用夏令时。