有没有一种在服务器端读取HTTP请求中的内容来执行时区偏移操作的方法,而不是将所有内容发送到客户端并由其处理?
有没有一种在服务器端读取HTTP请求中的内容来执行时区偏移操作的方法,而不是将所有内容发送到客户端并由其处理?
这更加复杂,但我之前不得不使用这种情况,因为机器和用户配置有时与访问者的偏好不匹配。例如,从澳大利亚服务器暂时访问您的站点的英国访问者。
使用地理位置服务(例如MaxMind.com),如@balabaster建议的那样,获取与其IP匹配的时区(Global.Session_Start最佳)。这对于本地ISP来说是很好的匹配,但对于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,以便在登录前显示时间。
$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
值,并将其返回给客户端。
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;
}
谢谢...
这是我使用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;
}
在服务器端的操作过滤器中:
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);
}
}
}