如何在页面获取用户本地时间
我有一个用ASP.NET编写的网页,我需要在Page_Load
检索最终用户的本地时间。 我想过使用Javascript获取当地时间(通过使用new Date()
),但问题在于脚本在服务器事件之后运行。
任何想法如何实现这一目标?
编辑:我的页面非常复杂:它显示一个图表,其中包含大量来自数据库,对象/字段选择列表等的计算字段; 客户现在要求它考虑用户的时区,并且时区应该由网页自动确定。 用户日期对于确定图表间隔(显示数据的哪一天)很重要。 数据加载(因为它非常复杂)在Page_Load
和Page_PreRender
。 放弃这些事件需要整页重写。
最终解决方案被解答:最终解决问题的方法如下。 我将当地日期保存在cookie中。 以下是设置cookie的方法:
function SetLocalDateCookie() {
var cookieName = 'LOCALDATE';
var localDate = new Date();
var realMonth = localDate.getMonth() + 1;
var localDateString = localDate.getFullYear() + "/" + realMonth + "/" + localDate.getDate();
setCookie(cookieName, localDateString, 2);
try {
var exdate = new Date();
exdate.setDate(exdate.getDate() + 2);
document.cookie = cookieName + "=" + escape(localDateString) + ";expires=" + exdate.toGMTString();
}
catch (e)
{ }
}
在我的母版页中,我在$(document).ready
调用此方法。 在我使用这个cookie的页面上,我将下面的代码添加到Page_Init
:
if (string.IsNullOrEmpty(CookieHandler.Instance.GetCookie(CookieKeys.LocalDate)))
{
Response.ClearContent();
Response.Write(@"<form id='local' method='post' name='local'>
<script type='text/javascript'>
SetLocalDateCookie();
document.getElementById('local').submit();
</script>
</form>");
Response.Flush();
Response.End();
}
然后我可以在C#代码中使用cookie值。 谢谢你的回答/评论!
我会解释一下下面的代码和你要做的事情。
在关闭此页面的第一个请求时,代码检查LocalTime是否尚未存储在Session中,如果不是,它将编写一个表单元素,一个隐藏的输入和一个javascript,它将使用当地时间发布该表单。 响应结束,因此您的报告将无法获得生成机会。
此提交将立即创建一个带有localTime集合的POST请求,然后ASP .Net将此POST值存储到Session中。
由于可用性,我还在原始页面中添加了302重定向(Response.Redirect)。 用户最初是一个GET请求,而不是POST,所以如果他/她想刷新页面,浏览器将重申最后一个操作,即form.submit()而不是GET请求。
你现在有当地时间。 但是,您不必每次请求都阅读它,因为它可以与UTC时间进行比较,然后与服务器的时间进行比较。
编辑:您需要将UTC时间解析为DateTime,但可能很容易找到格式,但可能取决于用户的文化(不确定此语句)。
public ReportPage()
{
this.Init += (o, e) =>
{
// if the local time is not saved yet in Session and the request has not posted the localTime
if (Session["localTime"] == null && String.IsNullOrEmpty(Request.Params["localTime"]))
{
// then clear the content and write some html, a javascript code which submits the local time
Response.ClearContent();
Response.Write(@"<form id='local' method='post' name='local'>
<input type='hidden' id='localTime' name='localTime' />
<script type='text/javascript'>
document.getElementById('localTime').value = new Date();
document.getElementById('local').submit();
</script>
</form>");
//
Response.Flush();
// end the response so PageLoad, PagePreRender etc won't be executed
Response.End();
}
else
{
// if the request contains the localtime, then save it in Session
if (Request.Params["localTime"] != null)
{
Session["localTime"] = Request.Params["localTime"];
// and redirect back to the original url
Response.Redirect(Request.RawUrl);
}
}
};
}
我不认为这是可能的,你不能在服务器端从客户端的本地机器上得到时间。
实现这一目标的唯一方法是使用一些JavaScript(因为这是基于客户端的,所以它将使用客户端的当前日期/时间)。 但正如你所说的那样,这将是在你的服务器事件已经运行之后,你的网页已经被渲染成HTML并发送到客户端。
一种选择是在Post Back之前捕获客户,但是不可能通过首页Page_Load
来做到这一点。
如何在页面上放置一个隐藏文本框,在C#中使用OnChange-eventhandler附加它,并使用OnLoad JavaScript函数将该值设置为您需要的来自客户端的值?
链接地址: http://www.djcxy.com/p/58563.html