C# 如何在页面加载时获取用户本地时间

C# 如何在页面加载时获取用户本地时间,c#,javascript,asp.net,timezone,C#,Javascript,Asp.net,Timezone,我有一个用ASP.NET编写的网页,我需要在page\u Load检索最终用户的本地时间。我曾考虑使用Javascript获取本地时间(通过使用newdate()),但问题是脚本是在服务器事件之后运行的 关于如何实现这一点有什么想法吗 编辑:我的页面相当复杂:它显示一个图表,其中包含大量来自数据库的计算字段、对象/字段选择列表等;客户现在要求它应该考虑用户的时区,并且时区应该由网页自动确定。用户日期对于确定图表间隔(显示数据的日期)很重要。 数据加载(因为它非常复杂)是在Page\u Load和

我有一个用ASP.NET编写的网页,我需要在
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);
            }
        }
    };
}