Asp.net 您能从请求变量确定时区吗?
有没有一种方法可以在服务器端进行时区偏移,通过http读取请求中的某些内容,而不是将所有内容发送给客户端并让其处理?在页面卸载之前的任何事件中…request.ServerVariables。如果您想要他们的物理时区,那么您可以检查他们的IP地址,并使用IP到地理位置转换工具Asp.net 您能从请求变量确定时区吗?,asp.net,datetime,.net-3.5,timezone,globalization,Asp.net,Datetime,.net 3.5,Timezone,Globalization,有没有一种方法可以在服务器端进行时区偏移,通过http读取请求中的某些内容,而不是将所有内容发送给客户端并让其处理?在页面卸载之前的任何事件中…request.ServerVariables。如果您想要他们的物理时区,那么您可以检查他们的IP地址,并使用IP到地理位置转换工具 我不确定是否有其他方法可以做到这一点,因此,如果您需要他们的计算机配置的时区,它将不得不等待页面加载javascript…这更复杂,但我以前不得不求助于这种情况,因为机器和用户配置文件设置有时与访问者的首选项不匹配。例如,
我不确定是否有其他方法可以做到这一点,因此,如果您需要他们的计算机配置的时区,它将不得不等待页面加载javascript…这更复杂,但我以前不得不求助于这种情况,因为机器和用户配置文件设置有时与访问者的首选项不匹配。例如,一名英国访问者从澳大利亚服务器临时访问您的站点
<script type="text/javascript" language="JavaScript">
var offset = new Date();
document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>');
</script>
<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=新日期();
文件。写(“”);
来自的持久值#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月的返回日期的。如果它只使用偏移量,那么许多时区是匹配的,而且大多数时区不使用夏令时。