我需要知道客户端的时间。我的行动方案是将偏移量保留在 cookie 中,然后进行计算。我的问题是我需要插入cookie,即使在加载第一页时也是如此。我知道有很多方法,但没有人回答需求。我需要在加载第一页之前使用本地时间。所以我不能使用 JavaScript。
我试图在帖子中将用户发送回客户端,放置cookie,然后将其返回到服务器,但这对谷歌来说是有问题的,因为他们没有cookie。
这是函数:
public static DateTime? GetClientTime()
{
HttpRequest Request = HttpContext.Current.Request;
if (Request.Cookies["DynoOffset"] != null)
{
string strOffset = Request.Cookies["DynoOffset"].Value;
int offset = int.Parse(strOffset);
TimeZone localZone = TimeZone.CurrentTimeZone;
DateTime currentDate = DateTime.Now;
DateTime CreationDate = localZone.ToUniversalTime(currentDate).AddMinutes(-offset);
return CreationDate;
}
else
{
StoreClientTime();
return null;
}
}
public static DateTime? StoreClientTime()
{
var Context = HttpContext.Current;
var Session = Context.Session;
var Response = Context.Response;
var Request = Context.Request;
// if the local time is not saved yet in Session and the request has not posted the localTime
if (Request.Cookies["DynoOffset"] == null && String.IsNullOrEmpty(Request.Params["localTime"]))
{
// then clear the content and write some html a javascript code which submit the local time
Response.ClearContent();
Response.Write("<form id='local' method='post' name='local'>" +
"<script src="/Js/jquery-1.7.1.min.js" type="text/javascript"></script>" +
"<script src="/Js/JqueryUI/jquery.cookie.js" type="text/javascript"></script>" +
"<script type="text/javascript">" +
"$.cookie("DynoOffset", new Date().getTimezoneOffset(), { expires: 150 });" +
"$("#local").submit()" +
"</script>" +
"</form>");
//
Response.Flush();
// end the response so PageLoad, PagePreRender etc won't be executed
Response.End();
return null;
}
else
{
return GetClientTime().Value;
}
}
我想根据计算找到偏移量,但我不知道该怎么做。
几件事:
- 您正在做太多工作,无法在 UTC 时间完成。 只需使用
DateTime.UtcNow
. - 编写脚本回发已成为过去。 你已经表明你正在使用jquery,所以只需做一个ajax帖子将其发送到服务器。 这也将解决您的谷歌问题。
- 如果你的第一页需要它,那么发送UTC时间并在客户端上转换它 - 或者做一个ajax get来检索它。
- 请记住,用户可以将时钟设置为他们想要的任何时区,并且由于夏令时/夏令时,许多用户的偏移量可以并且将会更改。 如果您将其偏移量保存在永久 cookie 中,则更改后它们返回时将有错误的时间。 确保它位于临时 cookie 中,并且您可能希望经常重置它。 您
- 说您正在使用客户端的本地时间处理数据? 你能详细说明一下是为了什么吗? 这是一件非常危险的事情,因为当地时间可能模棱两可。 您可能应该基于 UTC 进行处理。 如果在处理时需要客户端的偏移量,则应在服务器上使用
DateTimeOffset
。 在此处查看。