C# 如何在页面加载时获取用户本地时间
我有一个用ASP.NET编写的网页,我需要在C# 如何在页面加载时获取用户本地时间,c#,javascript,asp.net,timezone,C#,Javascript,Asp.net,Timezone,我有一个用ASP.NET编写的网页,我需要在page\u Load检索最终用户的本地时间。我曾考虑使用Javascript获取本地时间(通过使用newdate()),但问题是脚本是在服务器事件之后运行的 关于如何实现这一点有什么想法吗 编辑:我的页面相当复杂:它显示一个图表,其中包含大量来自数据库的计算字段、对象/字段选择列表等;客户现在要求它应该考虑用户的时区,并且时区应该由网页自动确定。用户日期对于确定图表间隔(显示数据的日期)很重要。 数据加载(因为它非常复杂)是在Page\u Load和
page\u Load
检索最终用户的本地时间。我曾考虑使用Javascript获取本地时间(通过使用newdate()
),但问题是脚本是在服务器事件之后运行的
关于如何实现这一点有什么想法吗
编辑:我的页面相当复杂:它显示一个图表,其中包含大量来自数据库的计算字段、对象/字段选择列表等;客户现在要求它应该考虑用户的时区,并且时区应该由网页自动确定。用户日期对于确定图表间隔(显示数据的日期)很重要。
数据加载(因为它非常复杂)是在Page\u Load
和Page\u PreRender
中完成的。放弃这些活动需要重写一整页
最终解决方案受以下答案启发:
下面是我最终解决问题的方法。我把当地的日期保存在饼干里。以下是设置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\u 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();
}
if(string.IsNullOrEmpty(CookieHandler.Instance.GetCookie(CookieKeys.LocalDate)))
{
Response.ClearContent();
响应。写入(@)
SetLocalDateCookie();
document.getElementById('local').submit();
");
Response.Flush();
Response.End();
}
然后我可以在C代码中使用cookie值。
感谢您的回答/评论 我认为这是不可能的,您无法从服务器端的客户端本地机器上获得时间 实现这一点的唯一方法是使用一些javascript(因为这是基于客户端的,所以它将使用客户端的当前日期/时间)。但正如您所说的,这将在服务器事件运行之后进行,并且您的web页面已呈现为HTML并发送到客户端
另一种方法是在发回帖子之前捕获客户端时间,但在初始
页面加载时不可能这样做在页面上放置一个隐藏的文本框怎么样,在C#中将OnChange eventhandler附加到它,并使用OnLoad JavaScript函数将该值设置为您需要的客户端值 据我所知,在服务器端执行的Page\u Load
事件中无法获取用户的本地时间,因此只能知道服务器的本地日期时间
要获取用户的本地时间,您需要在JavaScript页面加载时执行对服务器的异步调用,或者将本地时间存储在一个隐藏字段中,然后在回发时读取。或者只使用一个只包含js的中间页来获取本地时间,并重定向到当前页面,通过查询字符串或会话变量或post传递时间信息。我将稍微解释一下以下代码以及留给您的内容做
在这个页面的第一个请求中,代码检查本地时间是否还没有存储在会话中,如果没有,它将编写一个表单元素、一个隐藏的输入和一个javascript,该javascript将使用本地时间发布该表单。响应结束,因此您的报告将无法生成
此提交将立即创建一个设置了localTime的POST请求,然后ASP.Net将此POST值存储到会话中
由于可用性,我还向原始页面添加了302重定向(Response.redirect)。用户最初发出的是GET请求,而不是POST,因此如果他/她想刷新页面,浏览器将重复最后一个操作,即表单.submit(),而不是GET请求
你现在知道当地时间了。但您不必在每次请求时都阅读它,因为它可以与UTC时间进行比较,然后与服务器的时间进行比较
编辑:您需要将UTC时间解析为日期时间,但可能很容易找到格式,尽管可能取决于用户的文化(不确定此语句)
公共报告页()
{
this.Init+=(o,e)=>
{
//如果本地时间尚未保存在会话中,且请求尚未发布本地时间
if(Session[“localTime”]==null&&String.IsNullOrEmpty(Request.Params[“localTime”]))
{
//然后清除内容并编写一些html,这是一个提交本地时间的javascript代码
Response.ClearContent();
响应。写入(@)
document.getElementById('localTime')。值=新日期();
document.getElementById('local').submit();
");
//
Response.Flush();
//结束响应,使PageLoad、PagePreRender等不会执行
Response.End();
}
其他的
{
//如果请求包含localtime,则将其保存在会话中
if(Request.Params[“localTime”]!=null)
{
会话[“localTime”]=Request.Params[“localTime”];
//并重定向回原始url
重定向(Request.RawUrl);
}
}
};
}
您希望在运行服务器事件之前获得用户的本地时间吗?我也考虑过使用cookie…但它的值需要不断更新(它必须保留日期时间);还有,当第一次加载页面并且没有设置cookie时会发生什么?这是为了什么?为什么初始页面加载日期/时间不够?您需要这个本地日期时间做什么?也许还有另一种方法可以实现你的最终目标
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);
}
}
};
}